Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从excel CSV读取和写入其他文件时出现的问题_Python_Excel_Csv_Python 3.x - Fatal编程技术网

Python 从excel CSV读取和写入其他文件时出现的问题

Python 从excel CSV读取和写入其他文件时出现的问题,python,excel,csv,python-3.x,Python,Excel,Csv,Python 3.x,我尝试过一些事情,每次尝试都会遇到不同的错误。首先,我使用“r”和“w”选项进行读写,但这会导致在excel中查看时,实际行之间出现空行 所以,我发现我必须用“rb”和“wb”读写。但是,现在我得到了一个错误:_csv.error迭代器应该返回字符串,而不是字节。您在文本模式下打开文件了吗 这是我的密码: def readLines(): r = csv.reader(open('test.csv', "rb"), dialect="excel") return [l for l

我尝试过一些事情,每次尝试都会遇到不同的错误。首先,我使用“r”和“w”选项进行读写,但这会导致在excel中查看时,实际行之间出现空行

所以,我发现我必须用“rb”和“wb”读写。但是,现在我得到了一个错误:_csv.error迭代器应该返回字符串,而不是字节。您在文本模式下打开文件了吗

这是我的密码:

def readLines():
    r = csv.reader(open('test.csv', "rb"), dialect="excel")
    return [l for l in r] #causes the error

def writeFile(lines):
    resultFile = open('output.csv', 'wb')
    wr = csv.writer(resultFile, dialect='excel')
    wr.writerows(lines)

我对lines对象做了一些修改,要求它们是字符串。我这样做是否正确?

尝试以文本模式打开文件:

r = csv.reader(open('test.csv', "rt"), dialect="excel")

resultFile = open('output.csv', 'wt')

问题是我没有设置新行属性

以下是我现在正在使用的更新代码:

def readLines():
    r = csv.reader(open('test.csv', "rt", newline=''), dialect="excel")
    return [l for l in r]

def writeFile(lines):
    resultFile = open('output.csv', 'wt', newline='')
    wr = csv.writer(resultFile, dialect='excel')
    wr.writerows(lines)

如果您的文本带有重音或使用的语言不是英语,您可能需要从中选择正确的编码。某些文本编辑器允许您了解特定文件的编码。我和TextWrangler一起发现的。因此,读取带有西班牙语口音的文件的正确Python代码是:

import csv
def imp_csv(ruta):
    with open(ruta,'rt', newline='', encoding="mac_roman") as csvfile:
        r = csv.reader(csvfile, dialect='excel')
        for row in r:
            print(','.join(row))

我试过了,但结果是excel文件中有额外的行。+1。这是Python2和Python3之间的区别。Python3在打开文件时必须使用文本模式,因为它需要以Unicode字符串的形式读取内容。如果Excel表格中包含使用特定编码的文本,您还可以根据需要设置编码。@谢谢您解释此修复方法。我不确定它到底为什么起作用,但我认为这是由于3.x与2.x之间的差异。在Python2中,字符串类型实际上是一系列字节。当您从以二进制或文本模式打开的文件中读取它们时,这并没有什么区别。这被csv模块误用。二进制模式是必需的,因为它不能在换行符处停止解析。换行符可能是字符串值的一部分。在Python 2中,换行符作为其他字节读取。Python3中所需的文本模式需要另一种方式来说明不能解释换行符-换行符=see。str和bytes是不同的类型。