Dosyayı satır 2'den oku veya başlık satırını atla


242

Üstbilgi satırını atlayabilir ve satır2'den bir dosyayı okumaya nasıl başlayabilirim?

Yanıtlar:


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

51
Eğer yerine daha sonra başlık gerekirse next(f)kullanım f.readline()ve bir değişken olarak saklayın
— lanetlenmiş

36
Veya kullanın header_line = next(f).
— Samuel

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

Bu 1 satırı atlayacaktır. ['a', 'b', 'c'][1:]=>['b', 'c']
— Eric Duminil

3
@LjubisaLivac haklı - bu cevap herhangi bir çizgiyi genelleştirir, bu yüzden bu çok daha güçlü bir çözümdür.
— Daniel Soutar

17
Dosya okunamayacak kadar büyük olana kadar bu iyi. Bu küçük dosyalar için uygundur.
— CppLearner

1
Dilim ayrıca içeriğin bir kopyasını oluşturur . Bu gereksiz yere verimsizdir.
— chepner

Ne kullanmayla ilgili consume()gelen more-itertoolsbelirtilen docs.python.org/3/library/itertools.html#itertools-recipes ? Bunu stackoverflow.com/questions/11113803
— AnotherParker

24

İlk satırı ve daha sonra dosya üzerinde bazı işlemler yapmak istiyorsanız bu kod yardımcı olacaktır.

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

Bu satıra ihtiyaç duyulmuyorsa bir değişkene readline () atamak gerekli değildir. Ancak bu çözümü en çok seviyorum.
— Anna

Dosyayı yineleyici olarak kullanarak doğrudan okumaları karıştırmanız önerilmez (bu özel durumda zarar verilmez).
— chepner

9

Dilimleme yineleyiciler üzerinde çalışabiliyorsa ...

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

1
Bu, sorunu çözmenin gerçekten güzel ve pythonic bir yoludur ve keyfi sayıda başlık satırına genişletilebilir
— Dai

Bu gerçekten güzel bir infaz!
— Dizel

Harika bir çözüm
— Russ Hyde

Bu, şu anda olduğundan çok, çok daha fazla onaylanmalıdır.
— chepner

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

2
Bu, tüm dosyayı bir kerede belleğe okuyacağından, yalnızca oldukça küçük bir dosya okuyorsanız pratik olur.
— Hayden Schiff

1

Birden çok başlık satırı okuma görevini genelleştirmek ve okunabilirliği artırmak için yöntem çıkarmayı kullanırdım. coordinates.txtÜstbilgi bilgisi olarak kullanılacak ilk üç satırı belirtmek istediğinizi varsayalım .

Misal

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

Daha sonra yöntem çıkarma , başlık bilgileriyle ne yapmak istediğinizi belirtmenize olanak tanır (bu örnekte, başlık satırlarını virgül temelinde belirleyip bir liste olarak döndürüyoruz, ancak daha fazlasını yapmak için yer var).

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

Çıktı

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

Başka coordinates.txtbir başlık içeriyorsa, değiştirin numberheaderlines. En iyisi, ne yaptığı açıktır __readheader(rh, numberheaderlines=2)ve kabul edilen cevabın yazarının next()kodunda neden kullandığını anlamak veya yorum yapmak zorunda kalmamaktan kaçınırız .



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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.