Baca file dari baris 2 atau lewati baris tajuk

242

Bagaimana saya bisa melewati baris tajuk dan mulai membaca file dari line2?

super9
sumber

Jawaban:

453
with open(fname) as f:
    next(f)
    for line in f:
        #do something
SilentGhost
sumber
51
jika Anda memerlukan tajuk nanti, daripada next(f)menggunakan f.readline()dan menyimpannya sebagai variabel
dam
36
Atau gunakan header_line = next(f).
Samuel
94
f = open(fname,'r')
lines = f.readlines()[1:]
f.close()
chriscauley
sumber
Ini akan melewati 1 baris. ['a', 'b', 'c'][1:]=>['b', 'c']
Eric Duminil
3
@LjubisaLivac benar - jawaban ini umum untuk semua baris, jadi ini adalah solusi yang jauh lebih kuat.
Daniel Soutar
17
Ini baik-baik saja SAMPAI file terlalu besar untuk dibaca. Ini bagus untuk file kecil.
CppLearner
1
Irisan juga membangun salinan konten. Ini tidak efisien tidak perlu.
chepner
Bagaimana dengan menggunakan consume()dari more-itertoolsseperti yang dinyatakan dalam docs.python.org/3/library/itertools.html#itertools-recipes ? Saya mendengar tentang ini di stackoverflow.com/questions/11113803
AnotherParker
24

Jika Anda ingin baris pertama dan kemudian Anda ingin melakukan beberapa operasi pada file kode ini akan sangat membantu.

with open(filename , 'r') as f:
    first_line = f.readline()
    for line in f:
            # Perform some operations
saimadhu.polamuri
sumber
Tidak perlu untuk menetapkan readline () ke variabel jika seseorang tidak membutuhkan baris ini. Saya paling suka solusi ini.
Anna
Mencampur bacaan langsung dengan menggunakan file sebagai iterator tidak disarankan (meskipun dalam kasus khusus ini tidak ada kerusakan yang dilakukan).
chepner
9

Jika mengiris bisa bekerja pada iterator ...

from itertools import islice
with open(fname) as f:
    for line in islice(f, 1, None):
        pass
Vajk Hermecz
sumber
1
Ini adalah cara yang sangat bagus dan pythonic untuk menyelesaikan masalah dan dapat diperluas ke jumlah baris header yang berubah-ubah
Dai
Ini adalah eksekusi yang sangat bagus!
Diesel
Solusi luar biasa
Russ Hyde
Ini harus ditingkatkan, jauh lebih banyak daripada saat ini.
chepner
8
f = open(fname).readlines()
firstLine = f.pop(0) #removes the first line
for line in f:
    ...
Dror Hilman
sumber
2
Ini akan membaca seluruh file menjadi memori sekaligus, jadi itu hanya praktis jika Anda membaca file yang cukup kecil.
Hayden Schiff
1

Untuk menggeneralisasi tugas membaca beberapa baris header dan untuk meningkatkan keterbacaan, saya akan menggunakan metode ekstraksi. Misalkan Anda ingin tokenize tiga baris pertama coordinates.txtuntuk digunakan sebagai informasi header.

Contoh

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

Kemudian ekstraksi metode memungkinkan Anda menentukan apa yang ingin Anda lakukan dengan informasi tajuk (dalam contoh ini kami cukup memberi tokenize pada baris tajuk berdasarkan koma dan mengembalikannya sebagai daftar tetapi ada ruang untuk melakukan lebih banyak lagi).

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

Keluaran

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

Jika coordinates.txtberisi tajuk baris lain, cukup ubah numberheaderlines. Yang terbaik dari semuanya, jelas apa __readheader(rh, numberheaderlines=2)yang dilakukan dan kami menghindari kerancuan karena harus mencari tahu atau mengomentari mengapa penulis jawaban yang diterima menggunakan next()kode ini.

Minh Tran
sumber
1

Jika Anda ingin membaca beberapa file CSV mulai dari baris 2, ini berfungsi seperti pesona

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

(ini adalah bagian dari jawaban Parfait untuk pertanyaan yang berbeda)

Tiago Martins Peres 李大仁
sumber
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)
Mauro Rementeria
sumber