파이썬 가져 오기 CSV


193

약 2000 개의 레코드가있는 CSV 파일이 있습니다.

각 레코드에는 문자열과 범주가 있습니다.

This is the first line,Line1
This is the second line,Line2
This is the third line,Line3

이 파일을 다음과 같은 목록으로 읽어야합니다.

data = [('This is the first line', 'Line1'),
        ('This is the second line', 'Line2'),
        ('This is the third line', 'Line3')]

이 CSV를 Python을 사용하여 필요한 목록으로 가져 오려면 어떻게해야합니까?


2
그런 다음 csv모듈을 사용하십시오 . docs.python.org/2/library/csv.html
furas

4
귀하의 질문에 맞는 답변이 있으면 수락하십시오.
Maciej Gol

답변:


307

은 Using CSV 모듈 :

import csv

with open('file.csv', newline='') as f:
    reader = csv.reader(f)
    data = list(reader)

print(data)

산출:

[['This is the first line', 'Line1'], ['This is the second line', 'Line2'], ['This is the third line', 'Line3']]

튜플이 필요한 경우 :

import csv

with open('file.csv', newline='') as f:
    reader = csv.reader(f)
    data = [tuple(row) for row in reader]

print(data)

산출:

[('This is the first line', 'Line1'), ('This is the second line', 'Line2'), ('This is the third line', 'Line3')]

이전 Python 2는 csv모듈을 사용하여 답변 합니다.

import csv
with open('file.csv', 'rb') as f:
    reader = csv.reader(f)
    your_list = list(reader)

print your_list
# [['This is the first line', 'Line1'],
#  ['This is the second line', 'Line2'],
#  ['This is the third line', 'Line3']]

4
왜 'r'대신 'rb'를 사용합니까?
imrek

5
@DrunkenMaster b는 텍스트 모드와 달리 파일을 이진 모드로 엽니 다. 일부 시스템에서 텍스트 모드는 \n읽거나 쓸 때 플랫폼 별 새 줄로 변환 됨을 의미합니다 . docs를 참조하십시오 .
Maciej Gol

7
이것은 파이썬 3.x의에서 작업을하지 않습니다 "csv.Error을 : 반복자는 바이트하지, 문자열을 반환해야합니다 (텍스트 모드로 파일을 열습니까?)"대답은 아래를 참조하십시오 그 파이썬 3.x를 작동
길버트

2
디버깅 시간을 몇 초 단축하려면 "Python 2.x 버전"과 같은 첫 번째 솔루션에 대한 메모를 추가해야합니다.
paradite

csv 파일의 일부 열만 사용하여 첫 번째 솔루션을 사용하는 방법은 무엇입니까?
Sigur

54

파이썬 3 업데이트 :

import csv

with open('file.csv', newline='') as f:
    reader = csv.reader(f)
    your_list = list(reader)

print(your_list)

산출:

[['This is the first line', 'Line1'], ['This is the second line', 'Line2'], ['This is the third line', 'Line3']]

지정 'r'은 기본 모드이므로 지정하지 않아도됩니다. 문서에서는 csvfile이 파일 객체 인 경우 newline = ''로 열어야합니다.
AMC

44

팬더 는 데이터 처리에 능숙합니다. 사용 방법의 예는 다음과 같습니다.

import pandas as pd

# Read the CSV into a pandas data frame (df)
#   With a df you can do many things
#   most important: visualize data with Seaborn
df = pd.read_csv('filename.csv', delimiter=',')

# Or export it in many ways, e.g. a list of tuples
tuples = [tuple(x) for x in df.values]

# or export it as a list of dicts
dicts = df.to_dict().values()

한 가지 큰 장점은 팬더가 헤더 행을 자동으로 처리한다는 것입니다.

Seaborn에 대해 들어 본 적이 없다면 자세히 살펴 보는 것이 좋습니다.

파이썬으로 CSV 파일을 읽고 쓰는 방법 도 참조하십시오 .

팬더 # 2

import pandas as pd

# Get data - reading the CSV file
import mpu.pd
df = mpu.pd.example_df()

# Convert
dicts = df.to_dict('records')

df의 내용은 다음과 같습니다.

     country   population population_time    EUR
0    Germany   82521653.0      2016-12-01   True
1     France   66991000.0      2017-01-01   True
2  Indonesia  255461700.0      2017-01-01  False
3    Ireland    4761865.0             NaT   True
4      Spain   46549045.0      2017-06-01   True
5    Vatican          NaN             NaT   True

dicts의 내용은

[{'country': 'Germany', 'population': 82521653.0, 'population_time': Timestamp('2016-12-01 00:00:00'), 'EUR': True},
 {'country': 'France', 'population': 66991000.0, 'population_time': Timestamp('2017-01-01 00:00:00'), 'EUR': True},
 {'country': 'Indonesia', 'population': 255461700.0, 'population_time': Timestamp('2017-01-01 00:00:00'), 'EUR': False},
 {'country': 'Ireland', 'population': 4761865.0, 'population_time': NaT, 'EUR': True},
 {'country': 'Spain', 'population': 46549045.0, 'population_time': Timestamp('2017-06-01 00:00:00'), 'EUR': True},
 {'country': 'Vatican', 'population': nan, 'population_time': NaT, 'EUR': True}]

팬더 # 3

import pandas as pd

# Get data - reading the CSV file
import mpu.pd
df = mpu.pd.example_df()

# Convert
lists = [[row[col] for col in df.columns] for row in df.to_dict('records')]

내용 lists은 :

[['Germany', 82521653.0, Timestamp('2016-12-01 00:00:00'), True],
 ['France', 66991000.0, Timestamp('2017-01-01 00:00:00'), True],
 ['Indonesia', 255461700.0, Timestamp('2017-01-01 00:00:00'), False],
 ['Ireland', 4761865.0, NaT, True],
 ['Spain', 46549045.0, Timestamp('2017-06-01 00:00:00'), True],
 ['Vatican', nan, NaT, True]]

tuples = [tuple(x) for x in df.values]tuples = list(df.itertuples(index=False))대신 쓸 수 있습니다 . 팬더 워드 프로세서의 사용을 억제한다는 메모를 수행 .values찬성 .to_numpy(). 세 번째 예는 혼란 스럽습니다. 먼저 변수 이름 tuples이이므로 튜플 목록을 의미하지만 실제로는 목록 목록입니다. 둘째, 전체 표현을로 바꿀 수 있다고 말할 수 있기 때문입니다 df.to_list(). 또한 두 번째 예가 실제로 여기에 해당되는지 여부도 모르겠습니다.
AMC

9

Python3 업데이트 :

import csv
from pprint import pprint

with open('text.csv', newline='') as file:
    reader = csv.reader(file)
    res = list(map(tuple, reader))

pprint(res)

산출:

[('This is the first line', ' Line1'),
 ('This is the second line', ' Line2'),
 ('This is the third line', ' Line3')]

csvfile이 파일 객체 인 경우로 열어야합니다 newline=''.
CSV 모듈


list(map())목록 이해를 넘어서 사용 합니까? 또한 두 번째 열의 각 요소 시작 부분에 공백이 있습니다.
AMC

5

당신이 확실 귀하의 의견에는 쉼표, 카테고리를 분리하는 것보다 다른이없는 경우, 당신은 수있는 라인으로 파일 라인을 읽기분할,, 다음에 그 결과를 밀어List

즉, CSV 파일을보고있는 것처럼 사용하는 것이 좋습니다 그래서, 보이는 말했다 모듈을 그것을 위해


4
result = []
for line in text.splitlines():
    result.append(tuple(line.split(",")))

1
이 게시물에 약간의 설명을 추가해 주시겠습니까? 코드는 (때로는) 훌륭하지만 코드와 설명은 (대부분) 더 좋습니다
Barranka

3
Barranka의 의견은 1 년이 넘은 것을 알고 있지만 이것을 우연히 발견하고 이해할 수없는 사람 은 text.splitlines () 행에 대해 각 개별 줄을 임시 변수 "line"에 넣습니다. line.split ( ",") 는 쉼표로 분할 된 문자열 목록을 만듭니다. tuple (~) 은 해당 목록을 튜플에 넣고 append (~) 는 결과를 결과에 추가합니다. 루프 후 결과 는 튜플 목록이며 각 튜플에는 한 줄이 있고 각 튜플 요소는 csv 파일의 요소입니다.
Louis

@Louis가 말한 것 외에도을 사용할 필요가 없으며 .read().splitlines()파일의 각 줄을 직접 반복 할 수 있습니다. for line in in_file: res.append(tuple(line.rstrip().split(",")))또한 사용 .split(',')하면 두 번째 열의 모든 요소가 추가 공백으로 시작합니다.
AMC

위에서 방금 공유 한 코드의 부록 : line.rstrip()-> line.rstrip('\n').
AMC

3

주석에서 이미 말했듯이 csv파이썬 에서 라이브러리를 사용할 수 있습니다 . csv는 쉼표로 구분 된 값을 의미하며, 레이블과 쉼표로 구분 된 값입니다.

범주 및 값 유형이기 때문에 튜플 목록 대신 사전 유형을 사용하고 싶습니다.

어쨌든 아래 코드에서 나는 두 가지 방법을 보여줍니다 : d사전과 l튜플의 목록입니다.

import csv

file_name = "test.txt"
try:
    csvfile = open(file_name, 'rt')
except:
    print("File not found")
csvReader = csv.reader(csvfile, delimiter=",")
d = dict()
l =  list()
for row in csvReader:
    d[row[1]] = row[0]
    l.append((row[0], row[1]))
print(d)
print(l)

컨텍스트 관리자를 사용하여 파일을 처리하지 않는 이유는 무엇입니까? 왜 두 가지 변수 명명 규칙을 혼합하고 있습니까? ?를 (row[0], row[1])사용하는 것보다 약하거나 오류가 발생하기 쉽지 tuple(row)않습니까?
AMC

왜 tuple (row)을 수행하는 것이 오류가 덜 발생한다고 생각합니까? 공식 파이썬 명명 규칙을 연결하십시오. 내가 아는 한, -except는 파일을 처리하는 좋은 방법입니다. 컨텍스트 처리기는 무엇을 의미합니까?
Francesco Boi

왜 tuple (row)을하는 것이 오류가 덜 발생한다고 생각합니까? 모든 단일 색인을 수동으로 작성하지 않아도되기 때문입니다. 실수를하거나 요소 수가 변경되면 코드를 변경해야합니다. 시도 제외는 괜찮습니다. 컨텍스트 관리자는 with 문입니다. 당신은 같은 주제에 많은 자원을 찾을 수 있습니다 하나.
AMC

컨텍스트 관리자가 좋은 try-except 블록보다 나은지 알 수 없습니다. 다른 긍정적 인 측면은 u 유형이 적은 코드입니다. 나머지의 경우 요소 수 (열 수를 의미한다고 생각합니다)가 원하는 값만 추출하는 반면 다른 요소는 모든 엑셀을 추출하기 때문에 내 것이 더 좋습니다. 특별한 요구 사항이 없으면 어떤 것이 더 낫다고 말할 수 없으므로 더 나은 논쟁을 낭비하는 것입니다.이 경우 둘 다 유효합니다.
Francesco Boi

컨텍스트 관리자가 좋은 try-except 블록보다 나은지 알 수 없습니다. 내 이전 의견을 참조하십시오. 컨텍스트 관리자 시도 제외를 대체하지 않습니다 .
AMC

2

간단한 루프로 충분합니다.

lines = []
with open('test.txt', 'r') as f:
    for line in f.readlines():
        l,name = line.strip().split(',')
        lines.append((l,name))

print lines

1
일부 항목에 쉼표가 있으면 어떻게합니까?
Tony Ennis

@TonyEnnis 그러면 고급 처리 루프를 사용해야합니다. 위의 Maciej의 답변은 Python과 함께 제공되는 csv 파서를 사용 하여이 작업을 수행하는 방법을 보여줍니다. 이 파서는 대부분 필요한 모든 논리를 가지고 있습니다.
헌터 맥밀런

1

불행히도 기존 답변 중 특히 만족 스럽지는 않습니다.

다음은 csv 모듈을 사용하는 간단하고 완전한 Python 3 솔루션 입니다.

import csv

with open('../resources/temp_in.csv', newline='') as f:
    reader = csv.reader(f, skipinitialspace=True)
    rows = list(reader)

print(rows)

skipinitialspace=True논쟁에 주목하십시오 . 불행히도 OP의 CSV에는 각 쉼표 뒤에 공백이 포함되어 있기 때문에이 작업이 필요합니다.

산출:

[['This is the first line', 'Line1'], ['This is the second line', 'Line2'], ['This is the third line', 'Line3']]

0

요구 사항을 약간 확장하고 줄 순서에 신경 쓰지 않고 범주별로 그룹화하려는 경우 다음 솔루션이 도움이 될 수 있습니다.

>>> fname = "lines.txt"
>>> from collections import defaultdict
>>> dct = defaultdict(list)
>>> with open(fname) as f:
...     for line in f:
...         text, cat = line.rstrip("\n").split(",", 1)
...         dct[cat].append(text)
...
>>> dct
defaultdict(<type 'list'>, {' CatA': ['This is the first line', 'This is the another line'], ' CatC': ['This is the third line'], ' CatB': ['This is the second line', 'This is the last line']})

이런 식으로 사전의 주요 관련 범주 아래에서 모든 관련 행을 사용할 수 있습니다.


0

다음은 Python 3.x에서 CSV를 다차원 배열로 가져 오는 가장 쉬운 방법이며 가져 오기없이 4 줄의 코드 만 있습니다!

#pull a CSV into a multidimensional array in 4 lines!

L=[]                            #Create an empty list for the main array
for line in open('log.txt'):    #Open the file and read all the lines
    x=line.rstrip()             #Strip the \n from each line
    L.append(x.split(','))      #Split each line into a list and add it to the
                                #Multidimensional array
print(L)

조심하십시오. 목록이 아니라 배열입니다! 컨텍스트 관리자를 사용하여 파일 객체를 올바르게 처리하지 않는 이유는 무엇입니까? 이 솔루션은 각 행의 두 번째 항목에 여분의 공백을 남겨두고 데이터에 쉼표가 포함되어 있으면 실패합니다.
AMC

-1

다음은 csv 모듈을 사용하지만 csv 테이블의 헤더 인 첫 번째 줄을 사용하여 dicts 목록으로 file.csv 내용을 추출하는 코드입니다.

import csv
def csv2dicts(filename):
  with open(filename, 'rb') as f:
    reader = csv.reader(f)
    lines = list(reader)
    if len(lines) < 2: return None
    names = lines[0]
    if len(names) < 1: return None
    dicts = []
    for values in lines[1:]:
      if len(values) != len(names): return None
      d = {}
      for i,_ in enumerate(names):
        d[names[i]] = values[i]
      dicts.append(d)
    return dicts
  return None

if __name__ == '__main__':
  your_list = csv2dicts('file.csv')
  print your_list

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