লাইন 2 থেকে ফাইল পড়ুন বা শিরোনাম সারিটি এড়িয়ে যান


242

আমি কীভাবে শিরোনাম সারিটি এড়িয়ে যেতে পারি এবং লাইন 2 থেকে কোনও ফাইল পড়া শুরু করব?

উত্তর:


453
with open(fname) as f:
    next(f)
    for line in f:
        #do something

51
আপনি, পরে হেডার প্রয়োজন পরিবর্তে যদি next(f)ব্যবহার f.readline()এবং একটি পরিবর্তনশীল হিসাবে এটি সংরক্ষণ
জঘন্য

36
বা ব্যবহার header_line = next(f)
স্যামুয়েল

94
f = open(fname,'r')
lines = f.readlines()[1:]
f.close()

এটি 1 লাইন এড়িয়ে যাবে। ['a', 'b', 'c'][1:]=>['b', 'c']
এরিক ডুমিনিল

3
@ লুজুবিসালিভা সঠিক - এই উত্তরটি যে কোনও লাইনে সাধারণীকরণ করে, তাই এটি অনেক বেশি শক্তিশালী সমাধান।
ড্যানিয়েল সাউটার

17
এই ফাইলটি পড়ার জন্য খুব বড়ো না হওয়া পর্যন্ত ঠিক আছে। এটি ছোট ফাইলগুলির জন্য ঠিক আছে।
CppLearner

1
স্লাইস সামগ্রীগুলির একটি অনুলিপিও তৈরি করে। এটি কেবল অকারণে অদক্ষ।
চিপনার

কি ব্যবহার সম্পর্কে consume()থেকে more-itertoolsযেমন বিবৃত docs.python.org/3/library/itertools.html#itertools-recipes ? আমি স্ট্যাকওভারফ্লো / প্রশ্নগুলি 11113803 এ সম্পর্কে শুনেছি
AnotherParker

24

আপনি যদি প্রথম লাইনটি চান এবং তারপরে আপনি ফাইলটিতে কিছু অপারেশন করতে চান এই কোডটি সহায়ক হবে।

with open(filename , 'r') as f:
    first_line = f.readline()
    for line in f:
            # Perform some operations

কোনও ভেরিয়েবলের জন্য পঠন () পাঠানোর প্রয়োজন নেই যদি কারও এই লাইনের প্রয়োজন না হয়। তবে আমি এই সমাধানটি সবচেয়ে পছন্দ করি।
আনা

পুনরাবৃত্তিকারী হিসাবে ফাইলটি ব্যবহারের সাথে সরাসরি পাঠের মিশ্রণের প্রস্তাব দেওয়া হয় না (যদিও এই নির্দিষ্ট ক্ষেত্রে কোনও ক্ষতি হয় না)।
চিপনার

9

কাটা যদি পুনরাবৃত্তির উপর কাজ করতে পারে ...

from itertools import islice
with open(fname) as f:
    for line in islice(f, 1, None):
        pass

1
সমস্যাটি সমাধানের এটি একটি দুর্দান্ত এবং অজগর উপায় এবং একটি নির্বিচার সংখ্যক শিরোনামের লাইনে বাড়ানো যেতে পারে
দাই

এটি একটি সত্যিই চমৎকার মৃত্যুদন্ড!
ডিজেল

দুর্দান্ত সমাধান
রাশ হাইড

এটি বর্তমানে তুলনায় অনেক বেশি, উচ্চতর করা উচিত।
চিপনার

8
f = open(fname).readlines()
firstLine = f.pop(0) #removes the first line
for line in f:
    ...

2
এটি পুরো ফাইলটি একবারে মেমরির মধ্যে পড়বে, সুতরাং আপনি যদি মোটামুটি ছোট ফাইলটি পড়েন তবে এটি কেবল ব্যবহারিক।
হেডেন শিফ

1

একাধিক শিরোনাম লাইন পড়ার কাজটি সাধারণকরণ এবং পাঠযোগ্যতা উন্নত করতে আমি পদ্ধতি নিষ্কাশন ব্যবহার করব। মনে করুন আপনি প্রথম তিনটি লাইন টোকানাইজ করতে চেয়েছিলেনcoordinates.txt শিরোনাম তথ্য হিসাবে ।

উদাহরণ

coordinates.txt
---------------
Name,Longitude,Latitude,Elevation, Comments
String, Decimal Deg., Decimal Deg., Meters, String
Euler's Town,7.58857,47.559537,0, "Blah"
Faneuil Hall,-71.054773,42.360217,0
Yellowstone National Park,-110.588455,44.427963,0

তারপরে পদ্ধতি নিষ্কাশন আপনাকে শিরোলেখ সম্পর্কিত তথ্য দিয়ে কী করতে চান তা নির্দিষ্ট করতে দেয় (উদাহরণস্বরূপ আমরা কমা ভিত্তিক শিরোনামের লাইনগুলিকে টোকানাইজ করে এটিকে একটি তালিকা হিসাবে ফিরিয়ে দিই তবে আরও অনেক কিছু করার সুযোগ রয়েছে)।

def __readheader(filehandle, numberheaderlines=1):
    """Reads the specified number of lines and returns the comma-delimited 
    strings on each line as a list"""
    for _ in range(numberheaderlines):
        yield map(str.strip, filehandle.readline().strip().split(','))

with open('coordinates.txt', 'r') as rh:
    # Single header line
    #print next(__readheader(rh))

    # Multiple header lines
    for headerline in __readheader(rh, numberheaderlines=2):
        print headerline  # Or do other stuff with headerline tokens

আউটপুট

['Name', 'Longitude', 'Latitude', 'Elevation', 'Comments']
['String', 'Decimal Deg.', 'Decimal Deg.', 'Meters', 'String']

যদি coordinates.txtঅন্য শিরোনাম থাকে তবে কেবল পরিবর্তন করুন numberheaderlines। সর্বোপরি, এটি কী __readheader(rh, numberheaderlines=2)করছে তা স্পষ্ট এবং স্বীকৃত উত্তরের লেখক তার কোডটিতে কেন ব্যবহার next()করেন তা নির্ধারণ করা বা মন্তব্য করার বিষয়ে অস্পষ্টতা এড়াতে পারি ।


1

আপনি যদি লাইন 2 থেকে শুরু করে একাধিক সিএসভি ফাইলগুলি পড়তে চান তবে এটি একটি কবজির মতো কাজ করে

for files in csv_file_list:
        with open(files, 'r') as r: 
            next(r)                  #skip headers             
            rr = csv.reader(r)
            for row in rr:
                #do something

(এটি পারফাইটের একটি পৃথক প্রশ্নের উত্তরের অংশ )


0
# Open a connection to the file
with open('world_dev_ind.csv') as file:

    # Skip the column names
    file.readline()

    # Initialize an empty dictionary: counts_dict
    counts_dict = {}

    # Process only the first 1000 rows
    for j in range(0, 1000):

        # Split the current line into a list: line
        line = file.readline().split(',')

        # Get the value for the first column: first_col
        first_col = line[0]

        # If the column value is in the dict, increment its value
        if first_col in counts_dict.keys():
            counts_dict[first_col] += 1

        # Else, add to the dict and set value to 1
        else:
            counts_dict[first_col] = 1

# Print the resulting dictionary
print(counts_dict)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.