Đọc tệp từ dòng 2 hoặc bỏ qua hàng tiêu đề


242

Làm cách nào tôi có thể bỏ qua hàng tiêu đề và bắt đầu đọc một tệp từ dòng2?

Câu trả lời:


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

51
nếu bạn cần tiêu đề sau, thay vì next(f)sử dụng f.readline()và lưu trữ dưới dạng một biến
bị nguyền rủa

36
Hoặc sử dụng header_line = next(f).
Samuel

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

Điều này sẽ bỏ qua 1 dòng. ['a', 'b', 'c'][1:]=>['b', 'c']
Eric Duminil

3
@LjubisaLivac đã đúng - câu trả lời này khái quát cho bất kỳ dòng nào, vì vậy đây là một giải pháp mạnh mẽ hơn nhiều.
Daniel Soutar

17
Điều này tốt UNTIL tập tin quá lớn để đọc. Điều này là tốt cho các tập tin nhỏ.
CppLearner

1
Các lát cắt cũng xây dựng một bản sao của nội dung. Đây chỉ là không hiệu quả không cần thiết.
chepner

Còn về việc sử dụng consume()từ more-itertoolsnhư đã nêu trong docs.python.org/3/l Library / itemools.html # itertools-recipes thì sao? Tôi đã nghe về điều này trên stackoverflow.com/questions/11113803
AnotherParker

24

Nếu bạn muốn dòng đầu tiên và sau đó bạn muốn thực hiện một số thao tác trên tệp, mã này sẽ hữu ích.

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

Không cần thiết phải gán readline () cho một biến nếu không cần dòng này. Tôi thích giải pháp này nhất, tuy nhiên.
Anna

Trộn các lần đọc trực tiếp với việc sử dụng tệp như một trình vòng lặp không được khuyến nghị (mặc dù trong trường hợp cụ thể này, không có tác hại nào được thực hiện).
chepner

9

Nếu cắt có thể làm việc trên các vòng lặp ...

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

1
Đây là một cách thực sự hay và đẹp mắt để giải quyết vấn đề và có thể được mở rộng thành một số dòng tiêu đề tùy ý
Đại

Đây là một thực hiện tốt đẹp!
Diesel

Giải pháp tuyệt vời
Russ Hyde

Điều này nên được nâng cấp nhiều, nhiều hơn so với hiện tại.
chepner

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

2
Điều này sẽ đọc toàn bộ tệp vào bộ nhớ cùng một lúc, vì vậy nó chỉ thực tế nếu bạn đang đọc một tệp khá nhỏ.
Hayden Schiff

1

Để khái quát hóa nhiệm vụ đọc nhiều dòng tiêu đề và để cải thiện khả năng đọc, tôi sử dụng phương pháp trích xuất. Giả sử bạn muốn mã hóa ba dòng đầu tiên coordinates.txtđể sử dụng làm thông tin tiêu đề.

Thí dụ

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

Sau đó, trích xuất phương thức cho phép bạn chỉ định những gì bạn muốn làm với thông tin tiêu đề (trong ví dụ này, chúng tôi chỉ đơn giản là mã hóa các dòng tiêu đề dựa trên dấu phẩy và trả về dưới dạng danh sách nhưng vẫn còn nhiều thứ phải làm).

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

Đầu ra

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

Nếu coordinates.txtchứa một tiêu đề khác, chỉ cần thay đổi numberheaderlines. Trên hết, rõ ràng những gì __readheader(rh, numberheaderlines=2)đang làm và chúng tôi tránh sự mơ hồ khi phải tìm ra hoặc nhận xét về lý do tại sao tác giả của câu trả lời được chấp nhận sử dụng next()trong mã của mình.


1

Nếu bạn muốn đọc nhiều tệp CSV bắt đầu từ dòng 2, điều này hoạt động như một cơ duyên

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

(đây là một phần câu trả lời của Parfait cho một câu hỏi khác)


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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.