파이썬으로 텍스트 파일을 목록이나 배열로 읽는 방법


176

파이썬에서 텍스트 파일의 행을 목록이나 배열로 읽으려고합니다. 목록이나 배열의 항목을 만든 후 개별적으로 액세스 할 수 있어야합니다.

텍스트 파일의 형식은 다음과 같습니다.

0,0,200,0,53,1,0,255,...,0.

(가) 어디 ...위이며, 실제 텍스트 파일이 수백 또는 수천 이상의 항목이 있습니다.

다음 코드를 사용하여 파일을 목록으로 읽으려고합니다.

text_file = open("filename.dat", "r")
lines = text_file.readlines()
print lines
print len(lines)
text_file.close()

내가 얻는 결과는 다음과 같습니다.

['0,0,200,0,53,1,0,255,...,0.']
1

분명히 전체 파일을 개별 항목 목록이 아닌 하나의 항목 목록으로 읽습니다. 내가 뭘 잘못하고 있죠?


1
참고로. 이 질문은 csv 파일을 파이썬의 목록으로 읽는 방법으로 표현해야합니다. 그러나 나는 4 년 전 OP의 원래 의도를 미처 알지 못합니다.
demongolem 2016 년



1
실제로, 최고의 답변을 보면 이것은 stackoverflow.com/questions/3277503/… 의 사본입니다 .
AMC

답변:


135

다음을 사용하여 문자열을 값 목록으로 분할해야합니다. split()

그래서,

lines = text_file.read().split(',')

1
난 당신이 여러 고려하면이 대답은 ... 나아져 될 수 있다고 생각 .csv합니다 (OP에서 언급 한 바와 같이) 파일을, 예를 들어, 행에 의해 알파벳 문자 (3)를 포함하는 파일 ( a,b,c, d,e,f, 등) 그리고 당신이 무엇을 얻을 위에 설명 된 절차를 적용 다음과 같은 목록입니다 : ['a', 'b', 'c\nd', 'e', ... ](항목 참고 'c\nd'). 위의 문제를 무시 하고이 절차는 단일 메가 목록의 개별 행에서 데이터를 축소합니다. 일반적으로 레코드 지향 데이터 파일을 처리 할 때 원하는 것이 아닙니다.
gboffi

split은 개행을 떠날 것입니다. 이 작업을 수행하지 마십시오. csv모듈 또는 다른 기존 파서
Jean-François Fabre

42

다음과 같이 numpy loadtxt를 사용할 수도 있습니다.

from numpy import loadtxt
lines = loadtxt("filename.dat", comments="#", delimiter=",", unpack=False)

1
나도 이것이 필요합니다. 라즈베리 파이에서 numpy가 느리게 작동한다는 것을 알았습니다. 이 응용 프로그램의 경우 파일을 열고 한 줄씩 읽었습니다.
거스

2
dtype : data-type매개 변수 를 통해 형식을 지정할 때도 유용합니다 . docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html Pandas read_csv는 사용하기 매우 쉽습니다. 그러나 형식을 지정하는 방법을 보지 못했습니다. 문자열이 필요한 반면 내 파일에서 수레를 읽는 중이었습니다. loadtxt를 보여 주셔서 감사합니다 @Thiru.
Ozgur Ozturk

1
txt 파일에 문자열이 포함되어 있으면 dtype을 지정해야합니다. 따라서 line = loadtxt ( "filename.dat", dtype = str, comments = "#", delimiter = ",", unpack = False)
Alex M981

19

리스트의리스트를 만들려고합니다. 빈리스트로 시작해야합니다

list_of_lists = []

다음으로 파일 내용을 한 줄씩 읽습니다.

with open('data') as f:
    for line in f:
        inner_list = [elt.strip() for elt in line.split(',')]
        # in alternative, if you need to use the file content as numbers
        # inner_list = [int(elt.strip()) for elt in line.split(',')]
        list_of_lists.append(inner_list)

일반적인 사용 사례는 원주 데이터이지만, 스토리지 우리의 단위는 당신이 할 수 있도록 우리는 하나 하나를 읽고 그 파일의 행입니다 전치 목록의 목록을. 이것은 다음 관용구로 수행 할 수 있습니다

by_cols = zip(*list_of_lists)

다른 일반적인 용도는 각 열에 이름을 지정하는 것입니다

col_names = ('apples sold', 'pears sold', 'apples revenue', 'pears revenue')
by_names = {}
for i, col_name in enumerate(col_names):
    by_names[col_name] = by_cols[i]

동종 데이터 항목에서 작업 할 수 있도록

 mean_apple_prices = [money/fruits for money, fruits in
                     zip(by_names['apples revenue'], by_names['apples_sold'])]

내가 작성한 대부분의 내용 csv은 표준 라이브러리에서 모듈 을 사용하여 속도를 높일 수 있습니다 . 또 다른 타사 모듈은 pandas일반적인 데이터 분석의 여러 측면을 자동화 할 수 있지만 여러 가지 종속성이 있습니다.


업데이트 Python 2 zip(*list_of_lists)에서는 다른 (전치 된) 목록의 목록이 반환 되지만 Python 3에서는 상황이 변경되어 아래 첨자가 불가능한 zip 객체zip(*list_of_lists)반환 됩니다.

인덱스 액세스 가 필요한 경우 사용할 수 있습니다

by_cols = list(zip(*list_of_lists))

두 버전의 Python에서 목록 목록을 제공합니다.

반면에 인덱스 액세스 가 필요하지 않고 열 이름으로 인덱싱 된 사전을 작성하는 것이라면 zip 객체는 괜찮습니다 ...

file = open('some_data.csv')
names = get_names(next(file))
columns = zip(*((x.strip() for x in line.split(',')) for line in file)))
d = {}
for name, column in zip(names, columns): d[name] = column

OP는 "목록 목록"이 아닌 CSV의 데이터 목록을 원한다고 밝혔다. csv모듈 만 사용하십시오 .
Blairg23

4

이 질문은 파일에서 쉼표로 구분 된 값 내용을 반복 가능한 목록으로 읽는 방법을 묻습니다.

0,0,200,0,53,1,0,255,...,0.

가장 쉬운 방법 csv은 다음과 같이 모듈을 사용하는 것입니다.

import csv
with open('filename.dat', newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',')

이제 다음 spamreader과 같이 쉽게 반복 할 수 있습니다 .

for row in spamreader:
    print(', '.join(row))

자세한 예는 설명서 를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.