Python 목록의 값으로 .csv 파일 만들기


182

Python 목록의 값으로 .csv 파일을 만들려고합니다. 목록의 값을 인쇄하면 모두 유니 코드 (?)입니다. 즉, 다음과 같이 보입니다.

[u'value 1', u'value 2', ...]

내가 목록의 값을 반복하면 for v in mylist: print v 일반 텍스트처럼 보입니다.

그리고 나는 넣을 수 있습니다 , 서로 사이에print ','.join(mylist)

그리고 파일로 출력 할 수 있습니다.

myfile = open(...)
print >>myfile, ','.join(mylist)

그러나 CSV로 출력하고 목록의 값 주위에 구분 기호가 있습니다.

"value 1", "value 2", ... 

서식에 구분 기호를 포함시키는 쉬운 방법을 찾을 수 없습니다. 예를 들어 join문을 통해 시도했습니다 . 어떻게해야합니까?


모두 감사합니다, 나는 내 질문을 해결하기 위해 몇 가지 답변에서 아이디어를 결합했습니다 :) 이제 csv 모듈을 사용하여 [...] 데이터를 파일로 바로 가져 오기 가져 오기 csv data = [...] myfile = open ( ..., 'wb') out = csv.writer (open ( "myfile.csv", "w"), delimiter = ',', quoting = csv.QUOTE_ALL) out.writerow (data)가 제대로 작동합니다. 내 데이터 [] xlrd를 사용하여 스프레드 시트에서 일부 데이터를 가져 와서 CSV 모듈은 올바른 구분 기호를 모두 사용하여 파일에 기록합니다 :) 다시 다시
Fortilan

보다 최근의 접근법은 팬더
Richard

Python 3.4 사용자, 이것은 저에게 가장 효과적이었습니다 : stackoverflow.com/questions/25022677/…
Leigh

답변:


254
import csv

with open(..., 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

편집 : 이것은 Python 2.x에서만 작동합니다.

python 3.x replace wb와 함께 작동하게하려면 w( 이 SO 답변 참조 )

with open(..., 'w', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)

11
csv2.x 의 모듈은 유니 코드를 제대로 다루지 않습니다. 이를 처리하는 방법에 대한 예제는 모듈 설명서를 참조하십시오. docs.python.org/library/csv.html
Ignacio Vazquez-Abrams

14
당신은 또한 wr.writerows (목록)를 사용할 수 있습니다
tovmeod

4
Writerows는 각 요소가 목록 인 경우 목록의 각 요소를 열로 나누는 것 같습니다. 이것은 테이블 출력에 매우 편리합니다.
whatnick

6
파이썬 3.4에서는 작동하지 않습니다. 나는 받고있다 TypeError: 'str' does not support the buffer interface.
botchniaque

1
Python 2의 경우 다음 'w'과 같이 사용 하십시오 : stackoverflow.com/questions/34283178/…
banan3'14

106

Alex Martelli의 보안 버전은 다음과 같습니다.

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

3
을 사용하여 1을 더한 값 with이 있으면 파일이 닫혔는지 확인
BoltzmannBrain

for 루프 내에서 이것을 사용하는 경우 전체 with 블록이 for 루프 아래에 중첩되어야합니까? 아니면 wr.writerow(my_list)루프 내부 에만있는 것이 더 효율적 입니까?
crypdick

1
@ crypdick 당신은 분명히 전체 블록을 루프에 넣지 않아야합니다. 파일을 연 다음 각 행을 루프로 작성하십시오. n 행을 쓰기 위해 파일을 n 번 열 필요가 없습니다.
Greg Kaleka

문자열 객체를 파일에 쓰는 경우 TypeError를 피하기 위해 파일을 여는 동안 'wt'를 사용하는 것이 좋습니다. 'str'이 아닌 바이트와 유사한 객체가 필요합니다.
don_Gunner94

41

다른 접근 방식의 경우 팬더 에서 DataFrame 을 사용할 수 있습니다. 아래 코드와 같이 쉽게 데이터를 CSV로 덤프 할 수 있습니다.

import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)

1
이 코드 스 니펫에 감사드립니다. 즉각적인 도움이 될 수 있습니다. 적절한 설명 이것이 문제에 대한 좋은 해결책 인지 보여줌으로써 교육적 가치를 크게 향상시킬 것이며 , 유사하지만 동일하지 않은 질문을 가진 미래 독자들에게 더 유용 할 것입니다. 제발 편집 설명을 추가하고, 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
Toby Speight

5
또한이 작업을 수행하려면 목록의 길이가 같아야합니다. 그렇지 않으면 ValueError (pandas v 0.22.0)가 표시됩니다
cheevahagadog

32

내가 찾은 가장 좋은 옵션 savetxtnumpy모듈 에서를 사용하는 것 입니다 .

import numpy as np
np.savetxt("file_name.csv", data1, delimiter=",", fmt='%s', header=header)

스택해야 할 여러 목록이있는 경우

np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt='%s', header=header)

8
이것은 숫자 작업에는 좋지만 목록에 문자열을 표시하면 작동하지 않습니다.
Ricardo Cruz

12

csv쉼표 또는 탭으로 구분 된 파일을 읽고 쓰 려면 파이썬 모듈을 사용하십시오 . csv 모듈은 인용을 잘 제어 할 수 있기 때문에 선호됩니다.

예를 들어, 다음은 잘 작동하는 예입니다.

import csv
data = ["value %d" % i for i in range(1,4)]

out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL)
out.writerow(data)

생산 :

"value 1","value 2","value 3"

4
나를 위해 빈 파일을 생성합니다
caspii

첫 실행은 비어 있으며 파이썬에서 열리기 때문에 삭제할 수도 없습니다. 두 번째 실행 (또는보다 정확한 : out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL))입력 open("myfile.csv","w")또는 새 파일에 관계없이 데이터를 채 웁니다 open("myfile2.csv","w"). 출력에서 ​​실행 된 파일 개체를 처리 할 수 ​​없지만 출력 프로세스를 할 일로 저장하는 것처럼 보입니다. 아웃 객체 저장 첫 번째 실행에 파일 객체하지만 파일 만 개체가 이미 존재하는 경우에 쓰는 @Saurabh Adhikary 아래에 적합한 솔루션하세요!
로렌스

7

이 경우 string.join 메소드를 사용할 수 있습니다.

명확성을 위해 몇 줄로 나눕니다. 여기에 대화식 세션이 있습니다.

>>> a = ['a','b','c']
>>> first = '", "'.join(a)
>>> second = '"%s"' % first
>>> print second
"a", "b", "c"

또는 한 줄로

>>> print ('"%s"') % '", "'.join(a)
"a", "b", "c"

그러나 문자열에 따옴표가 포함되어있어 문제가있을 수 있습니다. 이 경우 탈출 방법을 결정해야합니다.

CSV 모듈은 어떻게 esacpe 제어 많은 charecters에 (큰 따옴표, 또는 (단지 시세 및 seperators 만이 아닌 숫자 필드 등과 필드, 모든 필드) 다양한 인용 옵션 중 하나를 선택할 수 있도록, 당신이 모든 돌볼 수 이스케이프 된 문자열). 값이 단순하면 string.join이 정상일 수 있지만 많은 경우를 관리해야하는 경우 사용 가능한 모듈을 사용하십시오.


3

이 솔루션은 미쳤지 만 꿀처럼 부드럽게 작동합니다.

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n')
    wr.writerow(mylist)

파일은 csvwriter에 의해 작성되므로 csv 속성은 쉼표로 구분되어 유지됩니다. 구분자는 매번 목록 항목을 다음 행으로 이동하여 주요 부분에서 도움을줍니다.


1
너무 작고
빠름

1
작동하고 중첩 목록이있는 경우 @ vy32의 예를 확장하면 다음과 같은 이점이 있습니다.data = [["value %d" % i, "value %d" % (i+1)] for i in range(1,4)] with open("myfile.txt","w") as f: out = csv.writer(f, quoting=csv.QUOTE_ALL, delimiter='\n') out.writerow([';'.join(x) for x in data])
Lorenz

정말 미쳤어? 나는 그것이 완벽하게 들린다 고 생각한다
Stephanie Owen

3

CSV 파일을 작성하고 쓰려면

아래 예제는 csv 파일 작성 및 작성을 보여줍니다. 동적 파일 작성기 를 만들려면 패키지 가져 오기 csv 를 가져 와서 파일 참조가있는 파일의 인스턴스를 작성해야합니다. Ex : -with open ( "D : \ sample.csv", "w", newline = "" )을 file_writer로

여기에 언급 된 파일 디렉토리가없는 파일이 있으면 파이썬은 지정된 디렉토리에 동일한 파일을 만들고 "w"는 쓰기를 나타냅니다. 파일을 읽으려면 "w"를 "r"로 바꾸거나 추가하십시오 기존 파일에 "a"를 입력하십시오. newline = ""은 행을 만들 때마다 빈 행을 제거하여 빈 행을 제거하도록 지정합니다. 빈 행을 제거하기 위해 newline = ""을 사용하고 fields = [ "Names", "Age 와 같은 목록을 사용하여 일부 필드 이름 (열 이름)을 만듭니다. ","Class "] , 여기에서 writer = csv.DictWriter (file_writer, fieldnames = fields) 와 같은 writer 인스턴스에 Dictionary writer를 사용하고 열 이름을 할당하고 writer를 사용하는 열 이름을 csv에 씁니다 . , 파일 값을 쓰는 동안 사전 방법을 사용하여 전달해야하지만 여기서 키는 열 이름이고 값은 해당 키 값입니다

import csv 

with open("D:\\sample.csv","w",newline="") as file_writer:

   fields=["Names","Age","Class"]

   writer=csv.DictWriter(file_writer,fieldnames=fields)

   writer.writeheader()

   writer.writerow({"Names":"John","Age":21,"Class":"12A"})

2

주피터 노트

당신의 목록은 A

그런 다음 다음 광고를 코딩하여 csv 파일로 만들 수 있습니다 (열만!)

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()

1

반드시 CSV 모듈을 사용해야하지만, 유니 코드를 작성해야 할 가능성이 있습니다. 유니 코드를 작성 해야하는 사람들을 위해, 이것은 util 모듈로 사용할 수있는 예제 페이지의 클래스입니다.

import csv, codecs, cStringIO

class UTF8Recoder:
    """
    Iterator that reads an encoded stream and reencodes the input to UTF-8
    """
    def __init__(self, f, encoding):
        self.reader = codecs.getreader(encoding)(f)

def __iter__(self):
    return self

def next(self):
    return self.reader.next().encode("utf-8")

class UnicodeReader:
    """
    A CSV reader which will iterate over lines in the CSV file "f",
    which is encoded in the given encoding.
    """

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    f = UTF8Recoder(f, encoding)
    self.reader = csv.reader(f, dialect=dialect, **kwds)

def next(self):
    row = self.reader.next()
    return [unicode(s, "utf-8") for s in row]

def __iter__(self):
    return self

class UnicodeWriter:
    """
    A CSV writer which will write rows to CSV file "f",
    which is encoded in the given encoding.
"""

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    # Redirect output to a queue
    self.queue = cStringIO.StringIO()
    self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
    self.stream = f
    self.encoder = codecs.getincrementalencoder(encoding)()

def writerow(self, row):
    self.writer.writerow([s.encode("utf-8") for s in row])
    # Fetch UTF-8 output from the queue ...
    data = self.queue.getvalue()
    data = data.decode("utf-8")
    # ... and reencode it into the target encoding
    data = self.encoder.encode(data)
    # write to the target stream
    self.stream.write(data)
    # empty queue
    self.queue.truncate(0)

def writerows(self, rows):
    for row in rows:
        self.writerow(row)

1

다음은 csv모듈이 필요없는 다른 솔루션입니다 .

print ', '.join(['"'+i+'"' for i in myList])

예 :

>>> myList = [u'value 1', u'value 2', u'value 3']
>>> print ', '.join(['"'+i+'"' for i in myList])
"value 1", "value 2", "value 3"

그러나 초기 목록에 ""가 포함되어 있으면 이스케이프되지 않습니다. 필요한 경우 다음과 같이 이스케이프하는 함수를 호출 할 수 있습니다.

print ', '.join(['"'+myFunction(i)+'"' for i in myList])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.