2 행에서 파일을 읽거나 헤더 행을 건너 뜁니다.


242

헤더 행을 건너 뛰고 line2에서 파일을 읽으려면 어떻게해야합니까?

답변:


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()

한 줄을 건너 뜁니다. ['a', 'b', 'c'][1:]=>['b', 'c']
Eric Duminil

3
@LjubisaLivac이 옳습니다.이 답변은 모든 라인에 일반화되므로 훨씬 강력한 솔루션입니다.
Daniel Soutar

17
파일이 너무 커서 읽을 수 없을 때까지 괜찮습니다. 작은 파일에는 좋습니다.
CppLearner

1
슬라이스는 또한 내용 의 사본 을 만듭니다 . 이것은 불필요하게 비효율적입니다.
chepner

docs.python.org/3/library/itertools.html#itertools-recipes에 명시된대로 consume()from more-itertools을 사용 하는 것은 어떻 습니까? 나는 이것에 대해 stackoverflow.com/questions/11113803에서
AnotherParker

24

첫 번째 줄을 원하고 파일에서 일부 작업을 수행하려는 경우이 코드가 도움이 될 것입니다.

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

이 행이 필요하지 않은 경우 readline ()을 변수에 할당 할 필요는 없습니다. 그러나이 솔루션을 가장 좋아합니다.
Anna

파일을 반복자로 사용하여 직접 읽기를 혼합하는 것은 권장되지 않습니다 (이 경우에는 해가되지 않습니다).
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

그런 방법 추출 지정할 수 있습니다 무엇을 당신이 헤더 정보와 함께 할 (이 예에서 우리는 단순히 쉼표에 따라 헤더 행을 토큰 화하고 목록으로 반환하지만 훨씬 더 많은 일을 할 수있는 공간이있다)하고 싶다.

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()자신의 코드에서 사용하는 이유를 파악하거나 언급해야하는 모호성을 피합니다 .



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.