Python 如何使用with语句动态打开文件进行写入

Python 如何使用with语句动态打开文件进行写入,python,Python,我正在尝试根据字段逐行将一个大文件拆分为未知数量的文件。在这种情况下,我希望所有日期为2016年7月的记录写入一个文件,2016年8月写入另一个文件,等等。我不希望必须对文件进行两次梳理,首先填充需要创建的文件列表,然后实际写入 我的第一个想法是创建一个字典,其中键是文件名(基于日期),返回的是一个将写入csv文件的类 import csv class testClass: a = None k = None def __init__(self,theFile):

我正在尝试根据字段逐行将一个大文件拆分为未知数量的文件。在这种情况下,我希望所有日期为2016年7月的记录写入一个文件,2016年8月写入另一个文件,等等。我不希望必须对文件进行两次梳理,首先填充需要创建的文件列表,然后实际写入

我的第一个想法是创建一个字典,其中键是文件名(基于日期),返回的是一个将写入csv文件的类

import csv

class testClass:
    a = None
    k = None

    def __init__(self,theFile):
        with open(theFile,'wb') as self.k:
            self.a = csv.writer(self.k)


    def writeOut(self,inString):
        self.a.writerow(inString)

testDict = {'07m19':testClass('07m19_test2')}


testDict['07m19'].writeOut(['test'])
当我尝试运行此操作时,会出现以下错误:

value错误:对关闭的文件执行I/O操作

这是有意义的,当类初始化完成时,文件已关闭


我认为with语句是必需的,因为文件非常大,我无法将其全部加载到内存中。话虽如此,我不知道还有什么方法可以做到这一点。

你不一定需要一个类来完成这一点。让我们假设您的输入文件是csv文件,并且在第一列中有月份的全名:


 def __init__(self,theFile):
        self.k = open(theFile,'wb')
        self.a = csv.writer(self.k)

with open('path/to/input') as infile:
    for rownum,row in enumerate(csv.reader(infile),1):
        month = row[0]
        with open('path/to/output_{}.csv'.format(month), 'a') as outfile:
        if not rownum%100: print("Processed row", rownum, end='\r', flush=True)
            csv.writer(outfile).writerow(row)
    print("Processed row", rownum)

你不一定需要一个类。让我们假设您的输入文件是csv文件,并且在第一列中有月份的全名:

with open('path/to/input') as infile:
    for rownum,row in enumerate(csv.reader(infile),1):
        month = row[0]
        with open('path/to/output_{}.csv'.format(month), 'a') as outfile:
        if not rownum%100: print("Processed row", rownum, end='\r', flush=True)
            csv.writer(outfile).writerow(row)
    print("Processed row", rownum)
我无法将它全部载入记忆

您并不是通过删除文件将其全部加载到内存中。您只需创建一个。当您执行
f.read()
时,您将其所有内容作为字符串加载到内存中

因此,您可以:

class测试类:
定义初始化(self,theFile):
self.k=open(文件,'wb')
self.a=csv.writer(self.k)
def写出(自身、安装):
自写器(安装)
定义(自我):
self.k.close()
由于不保证在执行结束时调用
\uu del\uu
,因此您可能需要添加一个
close
方法,并像调用文件一样调用它

我无法将它全部载入记忆

您并不是通过删除文件将其全部加载到内存中。您只需创建一个。当您执行
f.read()
时,您将其所有内容作为字符串加载到内存中

因此,您可以:

class测试类:
定义初始化(self,theFile):
self.k=open(文件,'wb')
self.a=csv.writer(self.k)
def写出(自身、安装):
自写器(安装)
定义(自我):
self.k.close()

因为不能保证执行结束时会调用
\uu del\uu
,所以您可能需要添加一个
close
方法,并像调用文件一样调用它。

只需使用普通的open。“with”关闭文件。使用类对于您想要做的事情来说可能是过火了。因此,如果我省略with,它将不会影响内存使用率?不,它不会影响内存使用率。如果您坚持在这里使用类(我不推荐),那么您可能需要定义一个析构函数
\uu del\uuu(self)
,当您的类实例被销毁时,该析构函数会关闭文件
self.k
。只需使用一个纯打开的。“with”关闭文件。使用类对于您想要做的事情来说可能是过火了。因此,如果我省略with,它将不会影响内存使用率?不,它不会影响内存使用率。如果你坚持在这里使用一个类(我不推荐),那么你可能想定义一个析构函数
\uu del\uuu(self)
,当你的类实例被销毁时,它会关闭文件
self.k
。像这样打开
open
,你不会在代码结束时关闭文件。好吧,一次一个问题。OP有一个文件根本没有打开。像这样使用
open
,您不会在代码末尾关闭该文件。好吧,一次解决一个问题。OP有一个文件根本没有打开。