为什么在运行程序后尝试打开CSV文件时,Python CSV模块会将其设置为只读?

为什么在运行程序后尝试打开CSV文件时,Python CSV模块会将其设置为只读?,python,csv,Python,Csv,我正在使用一个程序(如下所示)查看两个CSV文件之间某些列的相似性,然后在数据与某些规范匹配时创建第三列(两列相同,但第三列不同),以便更新电子邮件列表 但是,当我在运行程序后尝试打开results.csv文件时,Windows Excel将仅以只读模式打开程序 有什么想法吗 这是我的密码: import csv sample_data = open("sample.csv", "r") lib_data = open("library.csv", "r") csv1 = csv.reader

我正在使用一个程序(如下所示)查看两个CSV文件之间某些列的相似性,然后在数据与某些规范匹配时创建第三列(两列相同,但第三列不同),以便更新电子邮件列表

但是,当我在运行程序后尝试打开results.csv文件时,Windows Excel将仅以只读模式打开程序

有什么想法吗

这是我的密码:

import csv

sample_data = open("sample.csv", "r")
lib_data = open("library.csv", "r")
csv1 = csv.reader(sample_data)
csv2 = csv.reader(lib_data)

results = open("results.csv", "w")
res_csv = csv.writer(results)

limit = 1071
limit2 = 1001

x = 0
y = 0

while (y != limit):
    row1 = csv1.__next__()
    while (x != limit2):
        row2 = csv2.__next__()
        if (row1[0] == row2[3] and row1[1] == row2[2] and row1[2] != row2[5]):
            print ("SAMPLE:")
            print (row1[0], ", ", row1[1], ", ", row1[2])
            print ("LIBRARY:")
            print (row2[3], ", ", row2[2], ", ", row2[5])
            print("\n")
            res_csv.writerow(row1)
        x = x+1
    y = y+1
    x = 0
    lib_data.seek(0)

您应该尝试通过导入操作系统模块并使用文件权限标志来打开具有特定权限的文件。下面是一个类似帖子的链接-

使用
确保文件正确关闭:

with open("sample.csv", "r") as sample_data:
    with open("library.csv", "r") as lib_data:
        with open("results.csv", "w") as results:
            # other code
如果使用Python>=2.7,甚至可以使用将多个变量放入一个

关闭该文件

结果关闭()


你让文件保持打开状态。要关闭它们,请注意,必须首先删除使用“打开文件”句柄的csv对象!因此,我很少将文件句柄与csv读写器对象分开打开

因此,更好的方法是:

import csv

csv1 = csv.reader(open("sample.csv", "rb"))
csv2 = csv.reader(open("library.csv", "rb"))

res_csv = csv.writer(open("results.csv", "w"))

limit = 1071
limit2 = 1001

x = 0
y = 0

while (y != limit):
    row1 = csv1.__next__()
    while (x != limit2):
        row2 = csv2.__next__()
        if (row1[0] == row2[3] and row1[1] == row2[2] and row1[2] != row2[5]):
            print ("SAMPLE:")
            print (row1[0], ", ", row1[1], ", ", row1[2])
            print ("LIBRARY:")
            print (row2[3], ", ", row2[2], ", ", row2[5])
            print("\n")
            res_csv.writerow(row1)
        x = x+1
    y = y+1
    x = 0
    lib_data.seek(0)

del csv1
del csv2
del res_csv
这使得您必须删除csv才能关闭文件句柄变得更加明确。还请注意,该状态以二进制模式打开文件,以避免行结束问题

编辑

如评论中所述,即使csv句柄仍然可用,
关闭文件的
错误。快速测试验证了这一点,因此正确的使用方法是:

import csv

with open("sample.csv", "rb") as sample:
    csv1 = csv.reader(sample)
    with open("library.csv", "rb") as lib_data: # the csv handle for this file is never used
        with open("results.csv", "wb") as results:
            res_csv = csv.writer(results)

            limit = 1071
            limit2 = 1001

            x = 0
            y = 0

            while (y != limit):
                row1 = csv1.__next__()
                while (x != limit2):
                    row2 = csv2.__next__()
                    if (row1[0] == row2[3] and row1[1] == row2[2] and row1[2] != row2[5]):
                        print ("SAMPLE:")
                        print (row1[0], ", ", row1[1], ", ", row1[2])
                        print ("LIBRARY:")
                        print (row2[3], ", ", row2[2], ", ", row2[5])
                        print("\n")
                        res_csv.writerow(row1)
                    x = x+1
                y = y+1
                x = 0
                lib_data.seek(0)

在使用Python2.7时遇到了同样的问题,但没有一个解决方案解决了我的问题。 解决方案:只需添加“报价”,例如:

res_csv=csv.writer(results,quoting=csv.QUOTE_ALL). 

这解决了我的问题

在脚本完成后,或者脚本仍在运行时?这是您的全部源代码,还是在您完成读取/写入后关闭文件?这是我的全部源代码。我想问题是没有关闭文件。你确定可以信任del有这种效果吗?Python中的IIRC del只删除名称,这会将引用的数量减少一个,如果没有其他引用(取决于实现细节),可能会导致它在将来某个时候被最终确定(或者不管正确的词是什么),但没有任何保证。但是为了可读性,显式关闭没有什么问题,是吗?@DSM我从来没有遇到过问题,但是YMMV@octopusgrabbus如果你觉得显式关闭更容易阅读,那也不会有什么坏处。请注意,您必须先
del
csv对象,否则将不允许关闭文件句柄。如果没有单独打开的句柄,seek将无法工作,这就是我这样做的原因。然而,也许我对CSV模块的理解有缺陷。