【问题标题】:Python Script Can not find file object to closePython 脚本找不到要关闭的文件对象
【发布时间】:2015-04-29 17:56:08
【问题描述】:

运行这个简单的脚本时,“output_file.csv”保持打开状态。我不确定在这种情况下如何关闭文件。

我查看了其他示例,其中 open() 函数被分配给诸如“f”之类的变量,并使用 f.close() 关闭对象。由于with / as csv-file,我不清楚文件对象的实际位置。有人介意从概念上解释断开连接的位置吗?理想情况下,想知道:

  1. 如何检查所有打开文件对象的命名空间
  2. 如何确定关闭这些对象的正确方法

读取数据列的简单脚本,其中第 1 列中的映射为空白,请填写

import csv

output_file = csv.writer(open('output_file.csv', 'w'))
csv.register_dialect('mydialect', doublequote=False, quotechar="'")

def csv_writer(data):
    with open('output_file.csv',"ab") as csv_file:
        writer = csv.writer(csv_file, delimiter=',', lineterminator='\r\n', dialect='mydialect')
        writer.writerow(data)

D = [[]]
for line in open('inventory_skus.csv'):
    clean_line = line.strip()
    data_points = clean_line.split(',')
    print data_points
    D.append([line.strip().split(',')[0], line.strip().split(',')[1]])

D2 = D
for i in range(1, len(D)):
    nr = D[i]
    if D[i][0] == '':
        D2[i][0] = D[i-1][0]
    else:
        D2[i] = D[i]

for line in range(1, len(D2)):
    csv_writer(D2[line])
    print D2[line]

【问题讨论】:

  • 你在脚本顶部做了一个不必要的显式open,你没有关闭它。那么为什么您对文件仍然处于打开状态感到惊讶呢?
  • python csv - not closing file 的可能重复项
  • 我最初尝试将 output_file.close() 放在最后,但出现此错误: output_file.close() AttributeError: '_csv.writer' object has no attribute 'close' 删除初始 output_file = csv.writer(open('output_file.csv', 'w')) 仍然导致文件保持打开状态

标签: python-2.7


【解决方案1】:

实际上,您正在创建两个文件对象(以两种不同的方式)。第一个:

output_file = csv.writer(open('output_file.csv', 'w'))

这隐藏在 csv.writer 中,但不会被它公开 您根本不使用该输出编写器,包括不关闭它。所以在垃圾收集之前它一直保持打开状态。

 with open('output_file.csv',"ab") as csv_file:

您在csv_file 中获得文件对象。上下文块负责关闭对象,因此无需手动关闭它(文件对象是上下文管理器)。

手动索引D2 是不必要的。另外,为什么要以二进制模式打开 CSV 文件?

def write_data_row(csv_writer, data):
    writer.writerow(data)

with open('output_file.csv',"w") as csv_file:
    writer = csv.writer(csv_file, delimiter=',', lineterminator='\r\n',   dialect='mydialect')

    for line in D2[1:]:
        write_data_row(writer, line)
        print line

【讨论】:

  • 啊,谢谢。我在开始时删除了不必要的 output_file。但是,第二个对象似乎没有被上下文块关闭。当我在控制台中运行时,'csv_file' 没有在这个块之外定义,所以我不确定如何关闭它。
  • 如何确定没有关闭?如果我在 with-block 之后尝试writer.writerow('abc'),我会得到ValueError: I/O operation on closed file
  • 打开 output_file.csv 时,我从 excel 中收到一个错误,说正在被另一个用户/程序使用
  • 文件对象有一个closed 属性。在with 块之后检查。您是否确定您没有对同一文件的其他引用(例如您刚刚删除的文件)?
猜你喜欢
  • 2017-06-13
  • 1970-01-01
  • 2020-05-30
  • 2022-01-18
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多