如何使用 Python 读写 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

如何将下面的 data写入 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),
]
96813 次浏览

下面是一些如何读取 CSV 文件以及如何使用 Python 编写 CSV 文件的最小完整示例。

Python 3: 读取 CSV 文件

纯巨蟒

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 只读取字符串。您需要手动转换为列类型。

Python2 + 3版本在此之前就有了(链接) ,但是 放弃了对 Python 2的支持。删除 Python2内容大大简化了这个问题的答案。

相关资料

输液管

看看我的实用工具包 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文件。请注意,熊猫会自动推断是否有一个标题行,但你也可以手动设置它。

如果你没有听说过 海洋生物,我建议你看看它。

其他

读取 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 文件读取到 tuple/dicts 列表或 Panda 数据框之后,就可以简单地处理这类数据了。没有 CSV 的特征。

替代品

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

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

参见: 数据序列化格式比较

如果您正在寻找创建配置文件的方法,那么您可能想阅读我的短文 Python 中的配置文件

写 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'])
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)

使用 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,然后需要创建一个文件实例,其中包含文件引用 Ex:

with open("D:\sample.csv","w",newline="") as file_writer

在这里,如果文件不存在,那么 python 将在指定的目录中创建一个相同的文件,而 w表示写,如果你想读取一个文件,那么用 r替换 w,或者用 a附加到现有文件。

newline=""指定每次创建行时都要删除一个额外的空行,这样我们可以使用 newline=""来消除空行,使用如下列表创建一些字段名(列名) :

fields=["Names","Age","Class"]

然后应用到编写实例,如:

writer=csv.DictWriter(file_writer,fieldnames=fields)

这里使用 Dictionary writer 和指定列名,将列名写入 csv,我们使用 writer.writeheader()和写入值,我们使用 writer.writerow({"Names":"John","Age":20,"Class":"12A"}),而写入文件值必须使用 Dictionary 方法传递,这里的键是列名,值是各自的键值。

导入 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"})

如果需要-读取一个不使用 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)

如果您使用的是 CSV 数据,并且想要一个比 pandas占用更少内存的解决方案,您可以尝试使用我的软件包 一点点。可以是 pip 安装的,或者只是作为一个单独的。Py 文件与您自己的代码,所以非常便携,适合无服务器的应用程序。

读取 CSV 数据就像调用 csv_import一样简单:

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"""


import littletable as lt
tbl = lt.Table().csv_import(data, fieldnames="number1,words,number2".split(','))
tbl.present()

印刷品:

  Number1   Words                                  Number2
──────────────────────────────────────────────────────────
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

(littletable使用 有钱模块显示表。)

littletable不会自动尝试转换数值数据,因此数值列需要一个数值转换函数。

def get_numeric(s):
try:
return int(s)
except ValueError:
try:
return float(s)
except ValueError:
return s


tbl = lt.Table().csv_import(
data,
fieldnames="number1,words,number2".split(','),
transforms={}.fromkeys("number1 number2".split(), get_numeric)
)
tbl.present()

这意味着:

  Number1   Words                                  Number2
──────────────────────────────────────────────────────────
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

数字列是右对齐而不是左对齐。

littletable还有其他类似 ORM 的特性,比如索引、连接、旋转和全文搜索。下面是数字列的统计表:

tbl.stats("number1 number2".split()).present()


Name       Mean   Min    Max   Variance              Std_Dev   Count   Missing
────────────────────────────────────────────────────────────────────────────────
number1   275.6    -2   1337   352390.3    593.6247130974249       5         0
number2    25.6    -1    123     2966.8   54.468339427597755       5         0

或调换位置:

tbl.stats("number1 number2".split(), by_field=False).present()


Stat                 Number1              Number2
───────────────────────────────────────────────────
mean                   275.6                 25.6
min                       -2                   -1
max                     1337                  123
variance            352390.3               2966.8
std_dev    593.6247130974249   54.468339427597755
count                      5                    5
missing                    0                    0

其他格式也可以输出,如 Markdown:

print(tbl.stats("number1 number2".split(), by_field=False).as_markdown())


| stat | number1 | number2 |
|---|---:|---:|
| mean | 275.6 | 25.6 |
| min | -2 | -1 |
| max | 1337 | 123 |
| variance | 352390.3 | 2966.8 |
| std_dev | 593.6247130974249 | 54.468339427597755 |
| count | 5 | 5 |
| missing | 0 | 0 |

从 Markdown 得到的结果是

立刻 1号 2号
刻薄 275.6 25.6
-2 -1
Max 1337年 123
方差 352390.3 2966.8
Std _ dev 593.6247130974249 54.468339427597755
计数 5 5
失踪了 0 0

最后,这里有一个文本搜索,搜索任何带有“搭便车者”的词条:

tbl.create_search_index("words")
for match, score in tbl.search.words("hitchhiker"):
print(match)

印刷品:

命名空间(数字1 =-2,words = “一个星际旅行者可以拥有的”,数字2 = 3)

我写了一个类似的问题。所以,为了把所有的东西都放在一个地方,这里是我的2分钱,用于一个非常快速和肮脏的解决方案。

这段代码意味着从一个 CSV 文件读取并写入另一个 CSV 文件。输出行的格式是固定的,我可以使用带有正确分隔符的 csv.write,但是在这种情况下,我必须做额外的工作来指定空格。但是它很好地展示了如何使用老式的 print ()函数输出文本:

#! /usr/bin/env python3


def main():
parser = argparse.ArgumentParser(
description='',
usage="""myparser [-h] print this help and exit
""",
formatter_class=argparse.ArgumentDefaultsHelpFormatter
)
parser.add_argument('-f', '--file',help='CSV input file', required=True)
  

args = parser.parse_args()


with open("output.file", "w") as outfile:


with open(args.file) as csvfile:
       

csv_reader = csv.reader(csvfile, delimiter=',')
line_count = 0
for row in csv_reader:
if line_count == 0:
line_count += 1
elif args.archive:
print(f'no:{row[0]}:{row[1]}::0:0:0:/bin/bash:0:0:{row[2]}:{row[3]}:{row[4]}:archive', file=outfile)
line_count += 1


return sys.exit(EXIT_SUCCESS)


if __name__ == '__main__':
main()
   

不好意思,压痕太大了。

这段代码打开一个 CSV 文件进行读取,并使用 print ()函数编写一个格式化的字符串,该字符串类似于:

no:Xoero:ToelAs:xtoelas:0:0:0:/bin/bash:0:0:y.r.j.pols@tue.nl:00311234567890:nl:archive