파이썬 CSV 문자열을 배열로


187

CSV로 인코딩 된 문자열을 구문 분석하여 배열 또는 사전으로 변환하는 간단한 라이브러리 또는 함수를 아는 사람이 있습니까?

필자 가 보았던 모든 예제에서 문자열이 아닌 파일 경로를 사용하기 때문에 내장 된 csv 모듈을 원하지 않는다고 생각 합니다.

답변:


259

io.StringIO다음을 사용하여 문자열을 파일 객체로 변환 한 다음 csv모듈에 전달할 수 있습니다 .

from io import StringIO
import csv

scsv = """text,with,Polish,non-Latin,letters
1,2,3,4,5,6
a,b,c,d,e,f
gęś,zółty,wąż,idzie,wąską,dróżką,
"""

f = StringIO(scsv)
reader = csv.reader(f, delimiter=',')
for row in reader:
    print('\t'.join(row))

split()바꿈이있는 간단한 버전 :

reader = csv.reader(scsv.split('\n'), delimiter=',')
for row in reader:
    print('\t'.join(row))

또는 구분 기호 split()로 사용 하여이 문자열을 줄로 \n묶은 다음 split()각 줄을 값으로 사용할 수 있지만 인용을 알고 있어야하므로 csv모듈을 사용하는 것이 좋습니다.

파이썬 2 당신은 수입에이 StringIO같은

from StringIO import StringIO

대신에.


6
csv 파일에 쉼표가 포함 된 문자열이 포함되어 있으면 split 메소드가 작동하지 않습니다.
Carson Myers

3
또는 따옴표로 묶은 값을 쉼표를 사용하거나 사용하지 않음
adamk

28
Python 3은 이제 io.StringIO를 사용합니다. (Python 3 사용자는 약간의 시간을 절약하십시오). io 및 io.StringIO를 가져옵니다.
JStrahl

3
대신을 .split('\n')사용할 수 있습니다 .splitlines().
Denilson Sá Maia

1
아니, 그것은 ogonki와 폴란드 문자와 아주 잘 작동합니다 :-)
Michał Niklas

70

단순-csv 모듈도 목록과 함께 작동합니다.

>>> a=["1,2,3","4,5,6"]  # or a = "1,2,3\n4,5,6".split('\n')
>>> import csv
>>> x = csv.reader(a)
>>> list(x)
[['1', '2', '3'], ['4', '5', '6']]

4
알아두면 좋지만 .split('\n')필드에 줄 바꿈이 있으면 이상한 일이 발생 한다는 점을 명심 하십시오.
Inaimathi

1
@ Inaimathi, CSV 인 경우 개행 문자를 이스케이프 처리해야합니다.
John La Rooy

필드를 인용하면 줄 바꿈을 이스케이프 처리하지 않아도됩니다.
Jonathan Stray

1
이 기능은 잘 문서화되어 있지 않습니다. 감사합니다.
cowlinator

13

csv.reader() https://docs.python.org/2/library/csv.html 의 공식 문서 는 매우 유용합니다.

파일 객체와 목록 객체가 모두 적합합니다

import csv

text = """1,2,3
a,b,c
d,e,f"""

lines = text.splitlines()
reader = csv.reader(lines, delimiter=',')
for row in reader:
    print('\t'.join(row))

11
>>> a = "1,2"
>>> a
'1,2'
>>> b = a.split(",")
>>> b
['1', '2']

CSV 파일을 구문 분석하려면 다음을 수행하십시오.

f = open(file.csv, "r")
lines = f.read().split("\n") # "\r\n" if needed

for line in lines:
    if line != "": # add other needed checks to skip titles
        cols = line.split(",")
        print cols

'복잡한 것보다 단순하다!'
Abdelouahab

9
-1이 솔루션의 문제점은 "문자열 이스케이프"를 고려하지 않는다는 것입니다. 즉, 3, "4,5,6, 65 개 대신 3 개 필드로 처리됩니다.
Zz'Rot

단순하지만 일부 경우에만 작동합니다. 이것은 일반적인 CSV 구문 분석 코드가 아닙니다.
Christophe Roussy

8

다른 사람들이 이미 지적했듯이 Python에는 CSV 파일을 읽고 쓰는 모듈이 포함되어 있습니다. 입력 문자가 ASCII 제한 내에 머무르는 한 꽤 잘 작동합니다. 다른 인코딩을 처리하려면 더 많은 작업이 필요합니다.

csv로 모듈에 대한 파이썬 문서 구현 동일한 인터페이스를 사용하지만 문자열을 유니 코드 다른 인코딩 및 반품을 처리 할 수 csv.reader의 확장. 설명서에서 코드를 복사하여 붙여 넣기 만하면됩니다. 그 후 다음과 같이 CSV 파일을 처리 할 수 ​​있습니다.

with open("some.csv", "rb") as csvFile: 
    for row in UnicodeReader(csvFile, encoding="iso-8859-15"):
        print row

유니 코드 파일에 BOM (Byte Order Marker)이 없는지 확인하십시오.
Pierre

1
BOM 관련 : Python은 UTF-32, UTF-16 등의 공식 BOM을 감지하고 건너 뛰어야합니다. UTF-8의 비공식 Microsoft BOM을 건너 뛰려면 'utf-8-sig'대신에 코덱으로 사용하십시오 'utf-8'.
roskakori

7

문서 :

모듈은 구문 분석 문자열을 직접 지원하지 않지만 쉽게 수행 할 수 있습니다.

import csv
for row in csv.reader(['one,two,three']):
    print row

문자열을 단일 요소 목록으로 바꾸십시오.

이 예제가 문서에 명시 적으로 있으면 StringIO 가져 오기가 약간 과도하게 보입니다.



2

대체 솔루션은 다음과 같습니다.

>>> import pyexcel as pe
>>> text="""1,2,3
... a,b,c
... d,e,f"""
>>> s = pe.load_from_memory('csv', text)
>>> s
Sheet Name: csv
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| a | b | c |
+---+---+---+
| d | e | f |
+---+---+---+
>>> s.to_array()
[[u'1', u'2', u'3'], [u'a', u'b', u'c'], [u'd', u'e', u'f']]

여기 문서가 있습니다


2

이것을 사용하여 csv를 목록에로드하십시오.

import csv

csvfile = open(myfile, 'r')
reader = csv.reader(csvfile, delimiter='\t')
my_list = list(reader)
print my_list
>>>[['1st_line', '0'],
    ['2nd_line', '0']]

0

Panda는 파이썬에서 CSV를 읽는 매우 강력하고 똑똑한 라이브러리입니다.

여기 간단한 예를 들어, 네 개의 파일이있는 example.zip 파일이 있습니다.

EXAMPLE.zip
 -- example1.csv
 -- example1.txt
 -- example2.csv
 -- example2.txt

from zipfile import ZipFile
import pandas as pd


filepath = 'EXAMPLE.zip'
file_prefix = filepath[:-4].lower()

zipfile = ZipFile(filepath)
target_file = ''.join([file_prefix, '/', file_prefix, 1 , '.csv'])

df = pd.read_csv(zipfile.open(target_file))

print(df.head()) # print first five row of csv
print(df[COL_NAME]) # fetch the col_name data

데이터가 있으면 목록 또는 다른 형식으로 재생하도록 조작 할 수 있습니다.

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