如何用Python读写CSV文件?

  • 回答 (6)
  • 关注 (0)
  • 查看 (262)

通过文本文件交换信息是在程序之间共享信息的常用方法。用于交换数据的最流行的格式之一是CSV格式。但你怎么用呢?

Pythoncsv适用于大多数情况。如果工作需要大量数据或数值分析,pandas也具有CSV解析功能,应该处理其余的工作。那么如何用Python读写CSV文件?

SundeSunde提问于
土子美互联网从业者回答于

读取CSV文件

# importing csv module import csv   # csv file name filename = "aapl.csv"  # initializing the titles and rows list fields = [] rows = []   # reading csv file with open(filename, 'r') as csvfile:     # creating a csv reader object     csvreader = csv.reader(csvfile)           # extracting field names through first row     fields = csvreader.next()       # extracting each data row one by one     for row in csvreader:         rows.append(row)       # get total number of rows     print("Total no. of rows: %d"%(csvreader.line_num))   # printing the field names print('Field names are:' + ', '.join(field for field in fields))   #  printing first 5 rows print('\nFirst 5 rows are:\n') for row in rows[:5]:     # parsing each column of a row     for col in row:         print("%10s"%col),     print('\n')

上述程序的输出如下所示:

以上示例使用CSV文件aapl.csv,可以从此处下载。 使用同一目录中的aapl.csv文件运行此程序。

让我们试着理解这段代码。

  • 使用open(filename,'r')作为csvfile: csvreader = csv.reader(csvfile) 在这里,我们首先在READ模式下打开CSV文件。文件对象名为csvfile。文件对象将转换为csv.reader对象。我们将csv.reader对象保存为csvreader
  • fields = csvreader.next() csvreader是一个可迭代的对象。因此,.next()方法返回当前行并将迭代器前进到下一行。由于我们的csv文件的第一行包含标题(或字段名称),因此我们将它们保存在名为fields的列表中。
  • 对于csvreader中的行: rows.append(行) 现在,我们使用for循环遍历剩余的行。每行都附加到名为rows的列表中。如果您尝试打印每一行,可以发现该行只是一个包含所有字段值的列表。
  • print(“行的总数:%d”%(csvreader.line_num)) csvreader.line_num只是一个计数器,它返回已迭代的行数。

写入CSV文件

# importing the csv module import csv   # field names fields = ['Name', 'Branch', 'Year', 'CGPA']   # data rows of csv file rows = [ ['Nikhil', 'COE', '2', '9.0'],          ['Sanchit', 'COE', '2', '9.1'],          ['Aditya', 'IT', '2', '9.3'],          ['Sagar', 'SE', '1', '9.5'],          ['Prateek', 'MCE', '3', '7.8'],          ['Sahil', 'EP', '2', '9.1']]   # name of csv file filename = "university_records.csv"  # writing to csv file with open(filename, 'w') as csvfile:     # creating a csv writer object     csvwriter = csv.writer(csvfile)           # writing the fields     csvwriter.writerow(fields)           # writing the data rows     csvwriter.writerows(rows)

让我们尝试分解上面的代码。

  • 字段已经定义。fields是包含所有字段名称的列表。rows是列表的列表。每行都是包含该行的字段值的列表。
  • 使用open(filename,'w')作为csvfile: csvwriter = csv.writer(csvfile) 在这里,我们首先以WRITE模式打开CSV文件。文件对象名为csvfile。文件对象将转换为csv.writer对象。我们将csv.writer对象保存为csvwriter
  • csvwriter.writerow(场) 现在我们使用writerow方法编写第一行,它只是字段名称。
  • csvwriter.writerows(行) 我们使用writerows方法一次写入多行。

将字典写入CSV文件

# importing the csv module import csv   # my data rows as dictionary objects mydict =[{'branch': 'COE', 'cgpa': '9.0', 'name': 'Nikhil', 'year': '2'},          {'branch': 'COE', 'cgpa': '9.1', 'name': 'Sanchit', 'year': '2'},          {'branch': 'IT', 'cgpa': '9.3', 'name': 'Aditya', 'year': '2'},          {'branch': 'SE', 'cgpa': '9.5', 'name': 'Sagar', 'year': '1'},          {'branch': 'MCE', 'cgpa': '7.8', 'name': 'Prateek', 'year': '3'},          {'branch': 'EP', 'cgpa': '9.1', 'name': 'Sahil', 'year': '2'}]   # field names fields = ['name', 'branch', 'year', 'cgpa']   # name of csv file filename = "university_records.csv"  # writing to csv file with open(filename, 'w') as csvfile:     # creating a csv dict writer object     writer = csv.DictWriter(csvfile, fieldnames = fields)           # writing headers (field names)     writer.writeheader()           # writing data rows     writer.writerows(mydict)

在此示例中,我们将字典mydict写入CSV文件。

  • 使用open(filename,'w')作为csvfile: writer = csv.DictWriter(csvfile,fieldnames = fields) 这里,文件对象(csvfile)被转换为DictWriter对象。 在这里,我们将fieldnames指定为参数。
  • writer.writeheader() writeheader方法使用预先指定的字段名简单地写入csv文件的第一行。
  • writer.writerows(mydict) writerows方法只是写入所有行,但在每一行中,它只写入值(而不是键)。

所以,最后,我们的CSV文件如下所示:

重点:

  • 在csv模块中,可以给出可选的dialect参数,该参数用于定义特定于特定CSV格式的一组参数。默认情况下,csv模块使用excel方言,使其与excel电子表格兼容。您可以使用register_dialect方法定义自己的方言。 这是一个例子:
     csv.register_dialect(
    'mydialect',
    delimiter = ',',
    quotechar = '"',
    doublequote = True,
    skipinitialspace = True,
    lineterminator = '\r\n',
    quoting = csv.QUOTE_MINIMAL)

现在,在定义csv.reader或csv.writer对象时,我们可以像 这样指定方言:

csvreader = csv.reader(csvfile, dialect='mydialect')
  • 现在,考虑一个CSV文件在纯文本中看起来像这样:

我们注意到分隔符不是逗号而是分号。此外,行由两个换行符而不是一行换行。在这种情况下,我们可以指定分隔符和行终止符,如下所示: csvreader = csv.reader(csvfile, delimiter = ';', lineterminator = '\n\n')

因此,这是关于如何在python程序中加载和解析CSV文件的简短而简洁的讨论。

回答过的其他问题

如何在CentOS上创建Kubernetes集群?

土子美互联网从业者
系统环境 kubeadm支持多种系统,这里简单介绍一下需要的系统要求: Ubuntu16.04+ / Debian 9 / CentOS 7 / RHEL 7 / Fedora 25/26(best-effort) / HypriotOS v1.0.1+ / Other 2GB或...... 展开详请

如何通俗的了解kubernetes容器编排?

土子美互联网从业者

就是一个集群环境,以前的单集群方式不好,现在这个很厉害!可以承载上百T级别的数据,你的集群可以单独创生,也可以快速销毁,非常好用。

直播答题为什么会这么火?

土子美互联网从业者

前两天模拟考,语文作文就是直播答题为什么那么火,提到了好几个答题的软件,我看应该是大势所趋。

跳转到Visual Studio Code中的右括号?

土子美互联网从业者
命令“editor.action.jumpToBracket”在开始和结束括号之间跳转。 这是命令的默认键绑定,如从File |中访问的窗口默认键盘快捷键中所示 偏好| 键盘快捷键: { "key": "ctrl+shift+\\", "command": "editor.ac...... 展开详请

是否可以在运行状态下的容器中启动shell会话(不使用ssh)?

土子美互联网从业者
如果目标是检查应用程序的日志,则本文显示启动tomcat并将日志作为CMD的一部分跟踪。Tomcat日志可以在主机上作为“docker日志容器ID”来使用。 http://blog.trifork.com/2013/08/15/using-docker-to-efficient...... 展开详请

在Visual Basic中将字符串转换为颜色

土子美互联网从业者
System.Drawing.Color不是你要赋值的东西。无论你想要设置颜色,我想你想要的更像 SomeObject.Color = System.Drawing.Color.FromName("Lime") 因此,要从该变量中读取它,您可能需要以下内容: SomeObje...... 展开详请

关于作者

所属标签

扫码关注云+社区