Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python文件字典-如何?_Python_File_Dynamic_Dictionary - Fatal编程技术网

Python文件字典-如何?

Python文件字典-如何?,python,file,dynamic,dictionary,Python,File,Dynamic,Dictionary,我需要动态打开一些新的csv文件,这取决于内嵌包含的数据。这些csv文件需要有基于此数据的文件名,以便它们不能硬编码 我正在尝试制作一个{filename,filename.CSV}字典,但遇到以下行的问题: if not os.path.exists(filename): files_dict[filename] = open(filename,'w') files_dict[filename].write('Test') if语句工作正常-它将愉快地通过in

我需要动态打开一些新的csv文件,这取决于内嵌包含的数据。这些csv文件需要有基于此数据的文件名,以便它们不能硬编码

我正在尝试制作一个{filename,filename.CSV}字典,但遇到以下行的问题:

    if not os.path.exists(filename):
        files_dict[filename] = open(filename,'w')
    files_dict[filename].write('Test')
if语句工作正常-它将愉快地通过infle创建所有必要的csv文件

但它不喜欢write语句:

Traceback (most recent call last):
  File "R:\DataTeam\Orange\Landline\Fixed\Websource_Landline_FixedData_SplitIntoAccounts_20110307.py", line 141, in <module>
    files_dict[filename].write('Test')
KeyError: 'OBS Fixed 6-65544 - BRICO DEPOT 201005.csv'
回溯(最近一次呼叫最后一次):
文件“R:\DataTeam\Orange\Landline\Fixed\Websource\u Landline\u FixedData\u splitintocaccounts\u 20110307.py”,第141行,中
文件\u dict[filename]。写入('Test')
KeyError:“OBS已修复6-65544-BRICO仓库201005.csv”
关于如何写入这些已成功创建的文件,您有什么想法吗?还是有更简单的方法

谢谢


Tony

问题在于,如果文件已经存在,您没有打开文件或将文件名指定为dict中的键,因此出现了
KeyError
异常

请尝试以下方法:

# open file if not yet open
files_dict.setdefault(filename, open(filename,'w')) 
files_dict[filename].write("test")
如果文件名在dict中尚不存在,则以写入模式打开文件,并将处理程序存储在dict中,文件名作为密钥。请注意,已存在但尚未分配给dict的文件将被覆盖

如果只执行一次写入,则可以合并行,因为
setdefault
将返回分配给键的值

files_dict.setdefault(filename, open(filename,'w')).write("test")

问题在于,如果文件已经存在,您没有打开文件或将文件名指定为dict中的键,因此出现了
KeyError
异常

请尝试以下方法:

# open file if not yet open
files_dict.setdefault(filename, open(filename,'w')) 
files_dict[filename].write("test")
如果文件名在dict中尚不存在,则以写入模式打开文件,并将处理程序存储在dict中,文件名作为密钥。请注意,已存在但尚未分配给dict的文件将被覆盖

如果只执行一次写入,则可以合并行,因为
setdefault
将返回分配给键的值

files_dict.setdefault(filename, open(filename,'w')).write("test")

Shawn Chin提出的解决方案确实消除了错误,但它引入了一个微妙的缺陷:setdefault的第二个参数是一个值,而不是在需要时调用的函数;因此,每次调用setdefault时都会调用open(filename,'w')。这会产生一个额外的文件句柄,该句柄可能与同一程序中现有的打开句柄冲突,并且会产生“有效Python:90种编写更好Python的特定方法,第二版”中讨论的一些后果。这本书提供了一个更复杂的解决方案,但像这样简单的东西可能就足够了:

if filename in files_dict:
    file = files_dict[filename]
else:
    file = open(filename,'w')
    files_dict[filename] = file
file.print("test")

Shawn Chin提出的解决方案确实消除了错误,但它引入了一个微妙的缺陷:setdefault的第二个参数是一个值,而不是在需要时调用的函数;因此,每次调用setdefault时都会调用open(filename,'w')。这会产生一个额外的文件句柄,该句柄可能与同一程序中现有的打开句柄冲突,并且会产生“有效Python:90种编写更好Python的特定方法,第二版”中讨论的一些后果。这本书提供了一个更复杂的解决方案,但像这样简单的东西可能就足够了:

if filename in files_dict:
    file = files_dict[filename]
else:
    file = open(filename,'w')
    files_dict[filename] = file
file.print("test")

如果该文件已经存在,则不会打开该文件,也不会将其放入dict。如果该文件已经存在,则该文件将由这些语句的上一次迭代创建,因此应该已经存在于字典中并打开准备写入。如果该文件已经存在,则不会打开该文件,也不会放入dict。如果该文件已经存在,它可能是由这些语句的上一次迭代创建的,因此应该已经在字典中,并已打开准备编写。我从通过os.file检查文件是否存在改为只检查它是否在字典中,这似乎对它进行了排序。根据上面的评论,这些文件只能通过在前面迭代这些语句来创建,所以我不明白为什么它仍然不能打开并可供编写。不管怎样,它现在起作用了,我学到了一些东西,谢谢!我从通过os.file检查文件是否存在改为只检查它是否在字典中,这似乎对它进行了排序。根据上面的评论,这些文件只能通过在前面迭代这些语句来创建,所以我不明白为什么它仍然不能打开并可供编写。不管怎样,它现在起作用了,我学到了一些东西,谢谢!