【问题标题】:How do I read and write CSV files with Python?如何使用 Python 读写 CSV 文件?
【发布时间】: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 文件?

【问题讨论】:

标签: python 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 的东西大大简化了这个答案。

相关

微处理器

看看我的实用程序包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 文件,例如:

创建的 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。

替代方案

对于您的应用程序,以下内容可能很重要:

  • 其他编程语言的支持
  • 读/写性能
  • 紧凑性(文件大小)

另见: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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        相关资源
        最近更新 更多