如何在python中以CSV格式编写输出文件?

如何在python中以CSV格式编写输出文件?,python,csv,Python,Csv,我试图将输出文件作为CSV文件写入,但得到的不是错误就是预期结果。我也在使用Python 3.5.2和2.7 在Python 3.5中获取错误: wr.writerow(var) TypeError: a bytes-like object is required, not 'str' 及 在Python2.7中,我在一列中得到所有列的结果 预期结果: 与输入文件格式相同的输出文件 代码: 如果我使用的是resultFile=open(“out.csv”,“w”),我会在输出文件中额外获得一行

我试图将输出文件作为CSV文件写入,但得到的不是错误就是预期结果。我也在使用Python 3.5.2和2.7

在Python 3.5中获取错误:

wr.writerow(var)
TypeError: a bytes-like object is required, not 'str'

在Python2.7中,我在一列中得到所有列的结果

预期结果:
与输入文件格式相同的输出文件

代码:

如果我使用的是
resultFile=open(“out.csv”,“w”)
,我会在输出文件中额外获得一行


如果我使用上述代码,则会获得额外的一行和一列。

在Python3上,
csv
要求以文本模式而不是二进制模式打开文件。从文件模式中删除
b
。你也应该使用
newline=''

resultFile = open("out.csv", "w", newline='')
更好的方法是,将文件对象用作上下文管理器,以确保其自动关闭:

with open("input_1.csv", "r") as f1, \
     open("out.csv", "w", newline='') as resultFile:
    wr = csv.writer(resultFile, dialect='excel')
    for var in f1:
        wr.writerow([var.rstrip('\n')])
我还从
f1
中删除了行(只是为了删除换行符),并将行放入列表中
csv.writer.writerow
需要一个包含列的序列,而不是一个字符串

引述:

如果csvfile是文件对象,则应使用
newline=''
[1]打开它。[…]所有其他非字符串数据在写入之前都使用
str()
进行字符串化

[1] 如果未指定
newline=''
,则嵌入在带引号字段中的新行将无法正确解释,并且在使用
\r\n
linendings on write的平台上,将添加额外的
\r
。指定
换行符=''
,应该总是安全的,因为csv模块有自己的()换行符处理


不使用b模式打开文件

b模式以二进制方式打开文件

您可以按w打开文件

open_file = open("filename.csv", "w")

您正在以正常读取模式打开输入文件,但输出文件以二进制模式打开,方法正确

resultFile = open("out.csv", "w")

如上所示,如果您将“wb”替换为“w”,它将起作用。

其他人回答说,在使用Python 3时,您应该以文本模式打开输出文件,即

with open('out.csv', 'w', newline='') as resultFile:
    ...
但您还需要解析传入的CSV数据。您的代码将输入CSV文件的每一行作为单个字符串读取。然后,在不将该行拆分为其组成字段的情况下,它将字符串传递给CSV编写器。因此,
csv.writer
将字符串视为一个序列,并将每个字符(包括任何终止的新行字符)作为单独的字段输出。例如,如果您的输入CSV文件包含:

1,2,3,4 现在,输入CSV文件将被解析为字段,
将包含字符串列表-每个字段一个字符串。对于上一个示例,
将是:

for row in csv.reader(f1):
    print(row)

将所有这些放在一起,您可以得到以下代码:

import csv

with open('input_1.csv') as f1, open('out.csv', 'w', newline='') as resultFile:
    wr = csv.writer(resultFile, dialect='excel')
    for row in csv.reader(f1):
        wr.writerow(row)

您正在以二进制模式打开输出文件。只需从打开的
窗口(“out.csv”、“wb”)中删除
b
@Sevanteri:我试过了,但是在结果文件中获得一行是额外的,通常在windows上需要换行,或者由于添加了CR,在每行后面插入了空行chars@Jean-弗朗索瓦·法布:对于
\n
不是默认换行符的任何其他平台(因为
\n
字符将被替换到这些字符中的任何一个)。@Martijn Pieters:我使用了换行符,但获取每个字母是独立的column@krish:已更新;您不能传入单个字符串,因为这将被视为一行带列(每个字母都是一个单独的列)。我把它放在这里的一个列表中。@Martijn Pieters:谢谢,现在得到了预期的结果:)在没有b的情况下打开时,结果文件中有一行是空的。大家好,现在我得到了预期的结果。谢谢大家:)
for row in csv.reader(f1):
    # process the row
    wr.writerow(row)
for row in csv.reader(f1):
    print(row)
['1', '2', '3', '4'] 1,2,3,4
import csv

with open('input_1.csv') as f1, open('out.csv', 'w', newline='') as resultFile:
    wr = csv.writer(resultFile, dialect='excel')
    for row in csv.reader(f1):
        wr.writerow(row)