使用 Python 列表中的值创建 .csv 文件
- 2025-02-12 10:03:00
- admin 原创
- 99
问题描述:
我正在尝试使用 Python 列表中的值创建一个 .csv 文件。当我打印列表中的值时,它们都是 unicode (?),即它们看起来像这样
[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
语句。我该怎么做?
解决方案 1:
import csv
with open(..., 'wb') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(mylist)
编辑:这只适用于 python 2.x。
为了使其与 python 3.x 一起工作,请替换wb
为w
(参见此 SO answer)
with open(..., 'w', newline='') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(mylist)
解决方案 2:
以下是 Alex Martelli 的安全版本:
import csv
with open('filename', 'wb') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(mylist)
解决方案 3:
对于另一种方法,你可以在pandas中使用DataFrame:它可以轻松地将数据转储到 csv,就像下面的代码一样:
import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)
解决方案 4:
我发现最好的选择是使用模块savetxt
中的:numpy
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)
解决方案 5:
使用 python 的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"
解决方案 6:
这个解决方案听起来很疯狂,但效果却非常好
import csv
with open('filename', 'wb') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='
')
wr.writerow(mylist)
该文件由 csvwriter 编写,因此保留了 csv 属性,即逗号分隔。分隔符每次都会将列表项移动到下一行,从而帮助完成主要部分。
解决方案 7:
Jupyter 笔记本
假设你的列表名称是A
然后您可以编写以下代码并将其作为 csv 文件(仅列!)
R="
".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()
解决方案 8:
在这种情况下,您可以使用 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 模块可以为您处理所有这些问题,允许您在各种引用选项(所有字段、仅带引号和分隔符的字段、仅非数字字段等)之间进行选择,以及如何转义控制字符(双引号或转义字符串)。如果您的值很简单,string.join 可能就没问题,但如果您必须处理许多边缘情况,请使用可用的模块。
解决方案 9:
这是适用于Python 3.x的复制粘贴示例,其中包含定义您自己的分隔符和引号字符的选项。
import csv
mylist = ['value 1', 'value 2', 'value 3']
with open('employee_file.csv', mode='w') as employee_file:
employee_writer = csv.writer(employee_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
employee_writer.writerow(mylist)
这将生成employee_file.csv
如下内容:
"value 1","value 2","value 3"
笔记:
如果将引号设置为
csv.QUOTE_MINIMAL
,则.writerow()
仅当字段包含分隔符或引号字符时才会引用字段。这是默认情况。如果将引用设置为
csv.QUOTE_ALL
,则将.writerow()
引用所有字段。如果将引用设置为
csv.QUOTE_NONNUMERIC
,则将.writerow()
引用所有包含文本数据的字段,并将所有数字字段转换为浮点数据类型。如果将引号设置为
csv.QUOTE_NONE
,则将.writerow()
转义分隔符而不是将其括起来。在这种情况下,您还必须为 escapechar 可选参数提供一个值。
解决方案 10:
创建并写入 csv 文件
下面的示例演示了如何创建和写入 csv 文件。要创建动态文件编写器,我们需要导入包import csv,然后需要使用文件引用创建该文件的实例,例如:- with open("D:\sample.csv","w",newline="") as file_writer
这里如果文件不存在于提到的文件目录中,那么python将在指定的目录中创建一个相同的文件,“w”代表写入,如果要读取文件,则将“w”替换为“r”或将“a”附加到现有文件。newline=""指定每次创建行时都会删除一个额外的空行,因此为了消除空行,我们使用newline="",使用列表创建一些字段名称(列名),如fields = [“Names”,“Age”,“Class”],然后应用于writer实例,如
writer = csv.DictWriter(file_writer,fieldnames = fields)
这里使用字典writer并分配列名,要将列名写入csv我们使用writer.writeheader()并写入值我们使用writer.writerow({“Names”:“John”,“Age”:“20,”Class“:“12A”}),写入文件值时必须使用字典方法传递,这里的键是列名,值是您各自的键值
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"})
解决方案 11:
对于那些寻求不太复杂的解决方案的人来说。我实际上发现了一个更简单的解决方案,可以完成类似的工作:
import pandas as pd
a = ['a','b','c']
df = pd.DataFrame({'a': a})
df= df.set_index('a').T
df.to_csv('list_a.csv', index=False)
希望这也有帮助。
解决方案 12:
您当然应该使用 CSV 模块,但您可能需要编写 unicode。对于那些需要编写 unicode 的人,这是示例页面中的类,您可以将其用作实用程序模块:
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)
解决方案 13:
这是另一个不需要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])
扫码咨询,免费领取项目管理大礼包!