如何使用 Python 读写 CSV 文件?
Posted
技术标签:
【中文标题】如何使用 Python 读写 CSV 文件?【英文标题】:How do I read and write CSV files with Python? 【发布时间】:2017-05-25 21:38:26 【问题描述】:我有一个包含内容的文件example.csv
1,"A towel,",1.0
42," it says, ",2.0
1337,is about the most ,-1
0,massively useful thing ,123
-2,an interstellar hitchhiker can have.,3
如何使用 Python 阅读 example.csv
?
同样,如果我有
data = [(1, "A towel,", 1.0),
(42, " it says, ", 2.0),
(1337, "is about the most ", -1),
(0, "massively useful thing ", 123),
(-2, "an interstellar hitchhiker can have.", 3)]
如何使用 Python 将data
写入 CSV 文件?
【问题讨论】:
这是一个canonical question,因为我刚刚发现很多重复的问题以不同的方式构建问题,但本质上是这个问题。 骗子的例子:***.com/questions/5788521/…***.com/questions/26903304/…***.com/questions/1593318/…***.com/questions/24662571/python-import-csv-to-list***.com/questions/34568774/…***.com/questions/14725020/read-csv-file-from-python***.com/questions/16283799/…... 当您在 Google 上搜索“python read csv ***”时会出现更多重复项 【参考方案1】:这里有一些最小的完整示例,如何读取 CSV 文件以及如何使用 Python 编写 CSV 文件。
Python 3:读取 CSV 文件
纯 Python
import csv
# Define data
data = [
(1, "A towel,", 1.0),
(42, " it says, ", 2.0),
(1337, "is about the most ", -1),
(0, "massively useful thing ", 123),
(-2, "an interstellar hitchhiker can have.", 3),
]
# Write CSV file
with open("test.csv", "wt") as fp:
writer = csv.writer(fp, delimiter=",")
# writer.writerow(["your", "header", "foo"]) # write header
writer.writerows(data)
# Read CSV file
with open("test.csv") as fp:
reader = csv.reader(fp, delimiter=",", quotechar='"')
# next(reader, None) # skip the headers
data_read = [row for row in reader]
print(data_read)
之后data_read
的内容为
[['1', 'A towel,', '1.0'],
['42', ' it says, ', '2.0'],
['1337', 'is about the most ', '-1'],
['0', 'massively useful thing ', '123'],
['-2', 'an interstellar hitchhiker can have.', '3']]
请注意,CSV 仅读取字符串。您需要手动转换为列类型。
之前有一个 Python 2+3 版本 (link),但现在是 Python 2 support is dropped。删除 Python 2 的东西大大简化了这个答案。
相关
How do I write data into csv format as string (not file)? How can I use io.StringIO() with the csv module?:如果您想使用 Flask 即时提供 CSV,而不将 CSV 实际存储在服务器上,这很有趣。微处理器
看看我的实用程序包mpu
一个超级简单易记的:
import mpu.io
data = mpu.io.read('example.csv', delimiter=',', quotechar='"', skiprows=None)
mpu.io.write('example.csv', data)
熊猫
import pandas as pd
# Read the CSV into a pandas data frame (df)
# With a df you can do many things
# most important: visualize data with Seaborn
df = pd.read_csv('myfile.csv', sep=',')
print(df)
# Or export it in many ways, e.g. a list of tuples
tuples = [tuple(x) for x in df.values]
# or export it as a list of dicts
dicts = df.to_dict().values()
请参阅read_csv
docs 了解更多信息。请注意,pandas 会自动推断是否有标题行,但您也可以手动设置。
如果你还没有听说过Seaborn,我建议你去看看。
其他
许多其他库都支持读取 CSV 文件,例如:
dask.dataframe.read_csv
spark.read.csv
创建的 CSV 文件
1,"A towel,",1.0
42," it says, ",2.0
1337,is about the most ,-1
0,massively useful thing ,123
-2,an interstellar hitchhiker can have.,3
常见的文件结尾
.csv
处理数据
在将 CSV 文件读取到元组/字典列表或 Pandas 数据框后,它只是在处理此类数据。没有特定的 CSV。
替代方案
JSON:非常适合编写人类可读的数据;非常常用 (read & write) CSV:超级简单的格式 (read & write) YAML:很好读,类似于 JSON (read & write) pickle:一种 Python 序列化格式 (read & write) MessagePack (Python package):更紧凑的表示 (read & write) HDF5 (Python package):非常适合矩阵 (read & write) XML: 也存在 *sigh* (read & write)对于您的应用程序,以下内容可能很重要:
其他编程语言的支持 读/写性能 紧凑性(文件大小)另见:Comparison of data serialization formats
如果您正在寻找一种制作配置文件的方法,您可能想阅读我的短文Configuration files in Python
【讨论】:
@icedwater 这是一种可能性。但是,我更喜欢 Pandas:(1)它自动处理标题(2)它直接从路径加载文件并且不需要文件指针(3)它有更好的“导出”选项(比如 dict 导出 - 是的,你也可以用 CSV 做到这一点。但 Pandas 更简单)。但是请随意发布不需要 Pandas 的解决方案 :-) 谢谢,我想知道你使用csv
写作。我更喜欢csv
或pandas
,两者都更喜欢csv
而不是pandas
,因为它更有可能已经存在了。
@icedwater 好的,我添加了一个纯 csv
解决方案(现在在结构上也与我对 YAML 和 JSON 等其他文件格式的其他答案一致)
@Aran-Fey 谢谢!我没有意识到这一点。我修好了!
@Aran-Fey 再次感谢您 :-) 我更改了代码并将在下班后调整 mpu...正确读取 CSV 比应有的复杂得多^^【参考方案2】:
编写 CSV 文件
首先你需要导入 csv
例如:
import csv
with open('eggs.csv', 'wb') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=' ',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
【讨论】:
【参考方案3】:import csv
with open(fileLocation+'example.csv',newline='') as File: #the csv file is stored in a File object
reader=csv.reader(File) #csv.reader is used to read a file
for row in reader:
print(row)
【讨论】:
虽然这个 sn-p 可能是一个有效的答案,但一些解释会有所帮助。 不确定这对现有答案增加了什么【参考方案4】:使用 Pandas 读取 csv 文件
use pd.read_csv("D:\\sample.csv")
using only python :
fopen=open("D:\\sample.csv","r")
print(fopen.read())
创建并写入 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)
这里使用Dictionary writer和分配列名,将列名写入csv我们使用writer.writeheader()
,写入值我们使用writer.writerow("Names":"John","Age":20,"Class":"12A")
,而写入文件值必须使用字典方法传递,这里的键是列名而 value 是你各自的键值。
导入 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】:如果需要 - 在不使用 csv 模块的情况下读取 csv 文件:
rows = []
with open('test.csv') as f:
for line in f:
# strip whitespace
line = line.strip()
# separate the columns
line = line.split(',')
# save the line for use later
rows.append(line)
【讨论】:
以上是关于如何使用 Python 读写 CSV 文件?的主要内容,如果未能解决你的问题,请参考以下文章