Python:如果由人类生成CSV,则正确读取CSV,但如果由python生成则不会

时间:2014-02-11 17:49:16

标签: python csv

我有两个看似相同的CSV文件。一个人的价值由我输入,另一个人用Python写的。 Python能够在我编写的CSV中找到值,但无法在它编写的CSV中找到它们。

CSV看起来像这样:

line1: <blank>
line2: 0
line3: 1

以下是我用来编写CSV的内容,其中ID是我已经填写的列表:

myfile = open("Unused IDs.csv", 'ab')
wr = csv.writer(myfile, lineterminator='\n', quoting=csv.QUOTE_ALL)
wr.writerow(ID)

以下是我用来搜索CSV的内容:

query = 1
isThere = False 

try:
    with open('Unused IDs.csv', 'rb') as csvfile:
        my_content = csv.reader(csvfile)
        for row in my_content:
            Row = int(row[0])
            if Row == query:
                isThere = True
except IndexError:
    pass

正如我所说,有趣的是,当我使用我手动输入的CSV时,isThere评估为True。

注意:

  1. 我是Python的初学者。
  2. 可能相关:“Unused IDs.csv”由与读者相同的脚本编写。第一次运行时,它会向CSV添加新ID。第二次运行时,它首先检查CSV以查看是否已写入这些ID。
  3. 对于Python生成的CSV,

    >>> print repr(open('Unused IDs.csv', 'rb').read())
    '\r\n"0"\n"1"\n'
    

    对于'人工'生成的CSV,

    >>> print repr(open('Unused IDs.csv', 'rb').read())
    '0\r\n1\r\n'
    

1 个答案:

答案 0 :(得分:3)

故事的道德:如果您不希望它跳过阅读文件的其余部分,请不要放入异常处理程序。不要只是沉默你不理解的例外。

如果没有IndexError异常处理程序,您的代码实际上不适用于'python generated'示例文件,因为文件以空行开头。因此,当IndexError索引失败时,您会收到row[0]异常。这意味着忽略了文件的 rest ,当您向右跳到except IndexError行时,Python执行pass就是这样。

至少,您的代码可以避免使用IndexError

for row in my_content:
    if not row:
        continue

并完全删除try: / except IndexError:语句。您还可以将异常处理程序移动到更接近抛出异常的实际代码:

for row in my_content:
    try:
        Row = int(row[0])
    except (IndexError, ValueError):
        print "Skipped a row, could not parse a number"

有了这样的更改,您的示例文件可以正常工作,例如isThere设置为True