使用 Python 列表中的值创建一个 .csv 文件
Posted
技术标签:
【中文标题】使用 Python 列表中的值创建一个 .csv 文件【英文标题】:Create a .csv file with values from a Python list 【发布时间】:2011-01-06 05:52:40 【问题描述】:我正在尝试。当我打印列表中的值时,它们都是 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
声明。我该怎么做?
【问题讨论】:
谢谢大家,我结合了几个答案的想法来解决我的问题:) 我现在使用 csv 模块将 [...] 数据直接写入文件 import csv data = [ ...] myfile = open(..., 'wb') out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL) out.writerow (data) 效果很好,我通过使用 xlrd 从电子表格中抓取一些数据来构造我的 data[],然后 csv 模块将其写入具有正确分隔符的文件中:) 再次 最近的方法可能是使用pandas Python 3.4 用户,这对我来说效果最好:***.com/questions/25022677/… 另见:How do I read and write CSV files with Python? 【参考方案1】:Jupyter 笔记本
假设您的列表名称是A
然后您可以编写以下代码,并将其作为 csv 文件(仅限列!)
R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()
【讨论】:
【参考方案2】:对于那些寻找不太复杂的解决方案的人。实际上,我发现这是一种更简单的解决方案,可以完成类似的工作:
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)
希望这也有帮助。
【讨论】:
【参考方案3】:这是 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 可选参数提供一个值。
【讨论】:
【参考方案4】:创建并写入 csv 文件
以下示例演示了创建和编写 csv 文件。 要制作一个动态文件编写器,我们需要导入一个包import csv,然后需要创建一个带有文件引用的文件实例 例如:- 使用 open("D:\sample.csv","w",newline="") 作为 file_writer
这里如果文件不存在与提到的文件目录,那么python将在指定的目录中创建一个相同的文件,“w”代表写,如果你想读取一个文件,那么将“w”替换为“r”或附加到现有文件然后“a”。 newline="" 指定每次创建行时都会删除一个额外的空行,因此为了消除空行,我们使用 newline="",使用 fields=["Names" 之类的列表创建一些字段名(列名) ,"Age","Class"],然后适用于 writer 实例,例如 writer=csv.DictWriter(file_writer,fieldnames=fields) 这里使用 Dictionary writer 并分配列名,将列名写入 csv 我们使用 writer.writeheader() 并写入值我们使用 writer.writerow("Names":"John" ,"Age":20,"Class":"12A"),写入文件值时必须使用字典方式传递,这里key是列名,value是你各自的key值
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")
【讨论】:
【参考方案5】: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
(see this SO answer)
with open(..., 'w', newline='') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(mylist)
【讨论】:
请注意 2.x 中的csv
模块不能正确处理 unicode;有关如何处理此问题的示例,请参阅模块文档。 docs.python.org/library/csv.html
你也可以使用 wr.writerows(list)
Writerows 似乎将列表中的每个元素分解为列,如果每个元素也是一个列表。这对于输出表格非常方便。
这不适用于 python 3.4。我收到TypeError: 'str' does not support the buffer interface
。
对于 Python 2,请使用 'w'
,如下所示:***.com/questions/34283178/…【参考方案6】:
这个解决方案听上去很疯狂,但效果非常好
import csv
with open('filename', 'wb') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n')
wr.writerow(mylist)
该文件正在由 csvwriter 写入,因此 csv 属性得到维护,即逗号分隔。 分隔符每次都将列表项移动到下一行,从而在主要部分起到帮助作用。
【讨论】:
这么小这么快 有效,如果你有一个嵌套列表,扩展@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])
听起来真的很疯狂吗?我觉得听起来很不错【参考方案7】:
对于另一种方法,您可以在pandas 中使用DataFrame: 它可以很容易地将数据转储到csv,就像下面的代码一样:
import pandas
df = pandas.DataFrame(data="col1": list_1, "col2": list_2)
df.to_csv("./file.csv", sep=',',index=False)
【讨论】:
感谢您提供此代码 sn-p,它可能会提供一些即时帮助。一个正确的解释would greatly improve 它的教育价值,通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有类似但不相同的问题的读者更有用。请edit您的答案添加解释,并说明适用的限制和假设。 此外,要使其正常工作,列表需要具有相同的长度,否则您将收到 ValueError (pandas v 0.22.0)【参考方案8】:这是另一个不需要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])
【讨论】:
【参考方案9】:我发现的最佳选择是使用numpy
module 中的savetxt
:
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)
【讨论】:
这对数字工作很有用,但在列表中包含字符串时就不行了。 这在包含字符串和数字(浮点数和整数)的列表中对我有用。【参考方案10】:您肯定应该使用 CSV 模块,但很有可能,您需要编写 unicode。对于那些需要编写 unicode 的人,这是示例页面中的类,您可以将其用作 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)
【讨论】:
【参考方案11】:这是 Alex Martelli 的安全版本:
import csv
with open('filename', 'wb') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(mylist)
【讨论】:
加 1 用于使用with
,确保文件在完成后关闭
如果我在 for 循环中使用它,是否应该将整个 with 块嵌套在 for 循环下?或者在循环中只包含wr.writerow(my_list)
会更有效吗?
@crypdick 您绝对不应该将整个块放入循环中。打开文件,然后循环写入每一行。无需打开文件n次即可写入n行。
如果您将字符串对象写入文件,建议在打开文件时使用 'wt' 以避免 TypeError: a bytes-like object is required, not 'str'。【参考方案12】:
使用 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"
【讨论】:
为我生成一个空文件 第一次运行是空的,你也不能删除它,因为它是在python中打开的。第二次运行(或更准确地说:out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL))
填充数据,无论您放置open("myfile.csv","w")
还是新文件open("myfile2.csv","w")
。似乎out 对象无法处理运行时构建的文件对象,而是存储输出过程作为待办事项。换句话说:out 对象在第一次运行时存储文件对象,但仅在文件对象已经存在时才写入!请参阅下面的正确解决方案@Saurabh Adhikary【参考方案13】:
在这种情况下,您可以使用 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 module 可以为您处理所有这些,允许您在各种引用选项(所有字段、仅带有引号和分隔符的字段、仅非数字字段等)以及如何逃避控制字符(双引号或转义字符串)。如果您的值很简单, string.join 可能会没问题,但如果您必须管理大量边缘情况,请使用可用的模块。
【讨论】:
以上是关于使用 Python 列表中的值创建一个 .csv 文件的主要内容,如果未能解决你的问题,请参考以下文章