os.path.exists对Windows上名为“ CON.csv”的文件提供误报

时间:2019-12-15 16:22:23

标签: python python-3.x csv

我正在用Python做一些小规模的项目,以学习一些知识,其中之一是从.csv文件进行读写。我编写了一个脚本,该脚本应该检查文件是否存在,如果没有,请使用正确的头文件创建一个文件,然后将数据放入其中。如果确实存在,则应将数据添加到现有的.csv文件中。这是代码段:

    if not os.path.exists('crypto/{}.csv'.format(ticker)):
        with open('crypto/{}.csv'.format(ticker), 'w', newline='') as file:
            writer = csv.writer(file)
            logger.logChanges('{} ({}) added'.format(name, ticker), True)
            writer.writerow(['price', 'vol24h', 'mCap', 'supply', 'change1h', 'change1d', 'change7d', 'change1m'])
    else:
        print('{} exists'.format(ticker))

    with open('crypto/{}.csv'.format(ticker), 'a', newline='') as file:
        writer = csv.writer(file)
        writer.writerow([price, vol24h, mCap, supply, change1h, change1d, change7d, change1m])

这很好,直到要求检查CON.csv是否存在(不是这种情况),它说文件已存在,然后继续尝试写入不存在的文件。然后会出现以下错误:

ValueError: Must have exactly one of read or write mode

据我了解,这意味着它正在尝试读取和写入?我已经查看了文件夹,但CON.csv不在其中,但是有一个名为QTCON.csv的文件是否可能是误报的原因?以及我该如何解决?

编辑:

Traceback (most recent call last):
  File "c:/Users/lennart/Desktop/PythonProject/.vscode/crypto.py", line 62, in <module>
    grabInfo()
  File "c:/Users/lennart/Desktop/PythonProject/.vscode/crypto.py", line 55, in grabInfo
    with open('crypto/{}.csv'.format(ticker), 'a', newline='') as file:
ValueError: Must have exactly one of read or write mode

2 个答案:

答案 0 :(得分:2)

在Windows中,CON是一个特殊文件。如果有内存,则它始终随处都带有任何文件扩展名。这是来自DOS的保留。我记不清它的用途了,但我认为它是针对低级控制台I / O的。有一阵子了。逆向计算Exchange可能会告诉您比您想了解的更多的信息。

我认为,如果您为文件命名几乎其他任何内容(PRN或NUL或其他一些名称除外),您的脚本都将按预期运行。

有关特殊文件的更多信息:https://superuser.com/a/613335

并且:https://en.wikipedia.org/wiki/Device_file#MS-DOS

答案 1 :(得分:0)

后一种假设由于您的字符串格式不正确-

'crypto / {}'。format(ticker)是'crypto / QTCON.csv',当且仅当ticker ='QTCON.csv'

如果CON.csv返回假阳性,则显示为

CON.csv exists

并继续进行以下操作:

with open('crypto/{}.csv'.format(ticker), 'a', newline='') as file:
    writer = csv.writer(file)
    writer.writerow([price, vol24h, mCap, supply, change1h, change1d, change7d, change1m])

哪个与上块并没有真正的关系。 无论如何,请尝试将其更改为此:

with open('crypto/{}.csv'.format(ticker), 'a+', newline='') as file:
    writer = csv.writer(file)
    writer.writerow([price, vol24h, mCap, supply, change1h, change1d, change7d, change1m])

检出文件打开权限here