如何使用 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 写作。我更喜欢csvpandas,两者都更喜欢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 文件?的主要内容,如果未能解决你的问题,请参考以下文章

python读写csv文件

添加行时如何使python停止跳过csv文件中的行[重复]

说说如何利用 Python 处理 CSV 文件

python_如何读写csv数据

Python csv库整理(部分)

python 如何将数据写入某个csv文件的特定位置?