Python 3.3 CSV.Writer 写入额外的空白行
Posted
技术标签:
【中文标题】Python 3.3 CSV.Writer 写入额外的空白行【英文标题】:Python 3.3 CSV.Writer writes extra blank rows 【发布时间】:2013-04-22 16:21:51 【问题描述】:在 Windows 8 上使用 Python 3.3,写入 CSV 文件时,我收到错误 TypeError: 'str' does not support the buffer interface
和 "wb"
标志被使用。但是,当仅使用 "w"
标志时,我没有收到任何错误,但每一行都由一个空白行分隔!
问题写作
代码
test_file_object = csv.reader( open("./files/test.csv", 'r') )
next(test_file_object )
with open("./files/forest.csv", 'wb') as myfile:
open_file_object = csv.writer( open("./files/forest.csv", 'wb') )
i = 0
for row in test_file_object:
row.insert(0, output[i].astype(np.uint8))
open_file_object.writerow(row)
i += 1
错误
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-121-8cbb94f602a8> in <module>()
8 for row in test_file_object:
9 row.insert(0, output[i].astype(np.uint8))
---> 10 open_file_object.writerow(row)
11 i += 1
TypeError: 'str' does not support the buffer interface
问题解读
阅读时,我似乎无法使用"rb"
标志,因此在尝试忽略第一行(标题)时会出现错误iterator should return strings, not bytes
。
代码
csv_file_object = csv.reader(open('files/train.csv', 'rb'))
header = next(csv_file_object)
train_data = []
for row in csv_file_object:
train_data.append(row)
train_data = np.array(train_data)
错误
Error Traceback (most recent call last)
<ipython-input-10-8b13d1956432> in <module>()
1 csv_file_object = csv.reader(open('files/train.csv', 'rb'))
----> 2 header = next(csv_file_object)
3 train_data = []
4 for row in csv_file_object:
5 train_data.append(row)
Error: iterator should return strings, not bytes (did you open the file in text mode?)
【问题讨论】:
我认为这是 this question 的副本,等等。在 Python 3 中打开 csv 文件的方式有所不同;查看reader
和 writer
here 的打开。
【参考方案1】:
'wb'
模式适用于 Python 2。但在 Python 3 中是错误的。在 Python 3 中,csv 读取器需要字符串,而不是字节。这样,您必须以文本模式打开它。但是,\n
在阅读内容时不能被解释。这样在打开文件的时候就得传入newline=''
:
with open("./files/forest.csv", newline='') as input_file \
open('something_else.csv', 'w', newline='') as output_file:
writer = csv.writer(output_file)
...
如果文件不是纯ASCII,还应该考虑添加encoding=...
参数。
【讨论】:
从头开始创建 CSV 文件时,我需要做的就是open('filename.csv', 'w', newline='')
。谢谢!
感谢 Python 3 遇到了这个确切的问题。从另一个项目 ***.com/questions/8746908/… 他们还建议将 Lineterminator='\n' 参数与 csv 模块的各种编写器函数一起使用。哪种方法更好?我想将这个换行选项与内置的 open() 函数一起使用可能更 Pythonic,而不是通过导入的 csv 来控制这种行为?【参考方案2】:
您好,这可能对您有所帮助。
第一个问题,
改变
with open("./files/forest.csv", 'wb') as myfile:
open_file_object = csv.writer( open("./files/forest.csv", 'wb') )
到
with open("./files/forest.csv", 'w+') as myfile:
open_file_object = csv.writer( open("./files/forest.csv", 'w+') )
第二个问题:
完全相同的东西,除了更改为 r+
如果这不起作用,您可以随时使用它在创建后删除所有空白行。
for row in csv:
if row or any(row) or any(field.strip() for field in row):
myfile.writerow(row)
还有一点教训。 “rb”代表读取字节,本质上将其视为仅读取整数。我不确定你的 csv 的内容是什么;但是,该 csv 中必须有字符串。
这将有助于将来参考。
参数模式指向以下列之一开头的字符串 序列(其他字符可能跟随这些序列。):
``r'' Open text file for reading. The stream is positioned at the
beginning of the file.
``r+'' Open for reading and writing. The stream is positioned at the
beginning of the file.
``w'' Truncate file to zero length or create text file for writing.
The stream is positioned at the beginning of the file.
``w+'' Open for reading and writing. The file is created if it does not
exist, otherwise it is truncated. The stream is positioned at
the beginning of the file.
``a'' Open for writing. The file is created if it does not exist. The
stream is positioned at the end of the file. Subsequent writes
to the file will always end up at the then current end of file,
irrespective of any intervening fseek(3) or similar.
``a+'' Open for reading and writing. The file is created if it does not
exist. The stream is positioned at the end of the file. Subse-
quent writes to the file will always end up at the then current
end of file, irrespective of any intervening fseek(3) or similar.
【讨论】:
我不确定您为什么建议对文件使用+
模式。他们每个人都只做一件事(阅读或写作),从不两者兼而有之,所以这是完全没有必要的。
对不起,我快速阅读了问题的方式。我的答案的剥离部分应该可以工作。以上是关于Python 3.3 CSV.Writer 写入额外的空白行的主要内容,如果未能解决你的问题,请参考以下文章