programing tip

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

itbloger 2020. 6. 13. 10:29
반응형

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


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문을 통해 시도했습니다 . 어떻게해야합니까?


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)

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

import csv

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

내가 찾은 가장 좋은 옵션 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)

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

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

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"

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

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

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

또는 한 줄로

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

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

The CSV module can take care of all of this for you, allowing you to choose between various quoting options (all fields, only fields with quotes and seperators, only non numeric fields, etc) and how to esacpe control charecters (double quotes, or escaped strings). If your values are simple, string.join will probably be OK but if you're having to manage lots of edge cases, use the module available.


Jupyter notebook

Lets say that your list is A

Then you can code the following ad you will have it as a csv file (columns only!)

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

you should use the CSV module for sure , but the chances are , you need to write unicode . For those Who need to write unicode , this is the class from example page , that you can use as a util module:

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)

Here is another solution that does not require the csv module.

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

Example :

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

However, if the initial list contains some ", they will not be escaped. If it is required, it is possible to call a function to escape it like that :

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

This solutions sounds crazy, but works smooth as honey

import csv

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

The file is being written by csvwriter hence csv properties are maintained i.e. comma separated. The delimiter helps in the main part by moving list items to next line, each time.

참고URL : https://stackoverflow.com/questions/2084069/create-a-csv-file-with-values-from-a-python-list

반응형