【问题标题】:What does the csv.writerow() method return?csv.writerow() 方法返回什么?
【发布时间】:2022-01-28 06:22:04
【问题描述】:

我正在学习如何使用内置的 csv 模块写入 CSV 文件。

我使用以下代码打开文件:

file_to_output=open('to_save_file.csv', mode='w', newline='')

然后我创建一个 csv writer 对象:

csv_writer = csv.writer(file_to_output, delimiter=',')

然后我用writerow写一行:

csv_writer.writerow(['a', 'b', 'c'])

现在,这个函数返回7

很多帖子说这个数字是写入的字符数,但是当我关闭并检查文件时,只有5字符写入文件,即a,b,c

这个数字代表什么?

【问题讨论】:

  • 我猜你是在 Windows 机器上运行你的测试。额外的两个字符是行终止指示符,在 Windows 上是\r\n CRLF,所以writerow() 确实返回了写入的字节数。
  • 刚刚检查过,即使在 Linux 上,csv 模块也使用 CRLF 作为线路终止指示符。
  • 我使用的是 MAC 操作系统
  • 不管怎样,csv.writer 的默认dialectexcel,它使用CRLF 作为行终止指示符。你可以玩转dialect='unix',然后writerow 将返回6,因为在类Unix 系统中,行终止指示符只是LF,占一个额外的字符。

标签: python csv


【解决方案1】:

刚刚离开文档:

csvwriter.writerow(row):

...返回调用底层文件对象的write方法的返回值。

TextIOBase.write(s):

...返回写入的字符数。

所以从技术上讲,这个问题的答案是底层 write 方法返回的任何内容,在您的示例(TextIOBase 文件)中是写入的 字符数

但是,实际上,@accdias 是对的,您会看到使用 CRLF 的默认方言的效果。我也在用 Mac,12.1:

import csv

writer = csv.writer(open('output.csv', 'w', newline=''))
writer.writerow(['a','b','c'])
% hexdump -C output.csv
00000000  61 2c 62 2c 63 0d 0a                              |a,b,c..|
00000007

来自the csv module source

class excel(Dialect):
    """Describe the usual properties of Excel-generated CSV files."""
    delimiter = ','
    quotechar = '"'
    doublequote = True
    skipinitialspace = False
    lineterminator = '\r\n'
    quoting = QUOTE_MINIMAL

实例化writer()时可以更改dialect=lineterminator=

writer = csv.writer(open('output.csv', 'w', newline=''), lineterminator='\n')

现在我明白了:

00000000  61 2c 62 2c 63 0a                                 |a,b,c.|
00000006

【讨论】:

  • 作为csv 模块的documentation 提及,最接近CSV 文件格式标准的是RFC 4180,它指定行由CRLF 分隔(无论是否在Mac 上) )。这就是为什么默认是这样做的。我认为像 MS Excel 这样的主要应用程序也是这样做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
相关资源
最近更新 更多