อ่านไฟล์จากบรรทัดที่ 2 หรือข้ามส่วนหัวของแถว


242

ฉันจะข้ามแถวส่วนหัวและเริ่มอ่านไฟล์จาก line2 ได้อย่างไร

คำตอบ:


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

51
หากคุณต้องการส่วนหัวในภายหลังแทนที่จะnext(f)ใช้f.readline()และเก็บไว้เป็นตัวแปร
damned

36
header_line = next(f)หรือการใช้งาน
ซามูเอล

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

สิ่งนี้จะข้าม 1 บรรทัด ['a', 'b', 'c'][1:]=>['b', 'c']
Eric Duminil

3
@LububisaLivac ถูกต้อง - คำตอบนี้สรุปบรรทัดใด ๆ ดังนั้นนี่จึงเป็นคำตอบที่มีประสิทธิภาพยิ่งขึ้น
Daniel Soutar

17
นี่เป็นเรื่องดีจนกระทั่งไฟล์มีขนาดใหญ่เกินกว่าจะอ่านได้ สิ่งนี้ใช้ได้สำหรับไฟล์ขนาดเล็ก
CppLearner

1
ชิ้นยังสร้างสำเนาของเนื้อหา นี่เป็นเพียงการไร้ประสิทธิภาพโดยไม่จำเป็น
chepner

สิ่งที่เกี่ยวกับการใช้consume()จากmore-itertoolsที่ระบุไว้ในdocs.python.org/3/library/itertools.html#itertools-recipes ? ฉันได้ยินเกี่ยวกับเรื่องนี้ในstackoverflow.com/questions/11113803
AnotherParker

24

หากคุณต้องการบรรทัดแรกแล้วคุณต้องการดำเนินการบางอย่างกับไฟล์รหัสนี้จะเป็นประโยชน์

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

ไม่จำเป็นต้องกำหนด readline () ให้กับตัวแปรหากไม่ต้องการบรรทัดนี้ ฉันชอบวิธีนี้มากที่สุดอย่างไรก็ตาม
แอนนา

ไม่แนะนำให้ใช้การอ่านโดยตรงกับการใช้ไฟล์เป็นตัววนซ้ำ (แม้ว่าในกรณีนี้จะไม่มีอันตรายใด ๆ )
chepner

9

หากการแบ่งสามารถทำงานกับตัววนซ้ำ ...

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

1
นี่เป็นวิธีที่ดีและเป็นระบบในการแก้ปัญหาและสามารถขยายไปยังจำนวนบรรทัดส่วนหัวโดยพลการ
Dai

นี่เป็นการกระทำที่ดีจริงๆ!
ดีเซล

วิธีการแก้ปัญหาที่น่าอัศจรรย์
Russ Hyde

สิ่งนี้ควรได้รับการอัปเดตมากกว่านี้มากกว่าที่เป็นอยู่ในปัจจุบัน
chepner

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

2
การดำเนินการนี้จะอ่านไฟล์ทั้งหมดในหน่วยความจำพร้อมกันดังนั้นจึงเป็นประโยชน์เฉพาะในกรณีที่คุณกำลังอ่านไฟล์ขนาดเล็กพอสมควร
Hayden Schiff

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

จากนั้นวิธีการแยกช่วยให้คุณระบุสิ่งที่คุณต้องการจะทำกับข้อมูลส่วนหัว (ในตัวอย่างนี้เราเพียง tokenize บรรทัดส่วนหัวตามเครื่องหมายจุลภาคและส่งกลับเป็นรายการ แต่มีห้องที่จะทำมากขึ้น)

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มี headerline numberheaderlinesอีกเพียงแค่เปลี่ยน เหนือสิ่งอื่นใดมันชัดเจนว่า__readheader(rh, numberheaderlines=2)กำลังทำอะไรอยู่และเราหลีกเลี่ยงความคลุมเครือในการคิดหรือแสดงความคิดเห็นว่าทำไมผู้เขียนคำตอบที่ยอมรับใช้next()ในรหัสของเขา


1

หากคุณต้องการอ่านไฟล์ CSV หลายไฟล์ที่เริ่มต้นจากบรรทัดที่ 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

(นี่เป็นส่วนหนึ่งของคำตอบของ Parfaitสำหรับคำถามอื่น)


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.