如何并行打开19个以上的文件(Python)?
我有一个项目,需要读取数据,然后根据每行并行写入超过23个CSV文件。例如,如果这行是关于温度的,我们应该写入temperature.csv,如果是关于湿度的,>>写入潮湿的.csv,等等 我尝试了以下方法:如何并行打开19个以上的文件(Python)?,python,csv,nested,with-statement,Python,Csv,Nested,With Statement,我有一个项目,需要读取数据,然后根据每行并行写入超过23个CSV文件。例如,如果这行是关于温度的,我们应该写入temperature.csv,如果是关于湿度的,>>写入潮湿的.csv,等等 我尝试了以下方法: with open('Results\\GHCN_Daily\\MetLocations.csv','wb+') as locations, \ open('Results\\GHCN_Daily\\Tmax.csv','wb+')as tmax_d, \
with open('Results\\GHCN_Daily\\MetLocations.csv','wb+') as locations, \
open('Results\\GHCN_Daily\\Tmax.csv','wb+')as tmax_d, \
open('Results\\GHCN_Daily\\Tmin.csv','wb+')as tmin_d, \
open('Results\\GHCN_Daily\\Snow.csv', 'wb+')as snow_d, \
.
.
# total of 23 'open' statements
.
open('Results\\GHCN_Daily\\SnowDepth.csv','wb+')as snwd_d, \
open('Results\\GHCN_Daily\\Cloud.csv', 'wb+')as cloud_d, \
open('Results\\GHCN_Daily\\Evap.csv', 'wb+')as evap_d, \
我犯了以下错误
SystemError: too many statically nested blocks python
我搜索了这个错误,我找到了
当嵌套块超过20个时,将遇到此错误。
这是Python解释器的设计决定,将其限制为20
但是我写的open语句是并行打开文件的,而不是嵌套的
我做错了什么,如何解决这个问题
提前感谢。如果数据不是很大,为什么不读入所有数据并按类别对数据进行分组(例如,将所有关于温度的数据放在一个组中),然后一次性将分组的数据写入相应的文件中 我会有一个可能的文件列表=[‘湿度’、‘温度’、…]
制作一个包含可能文件、数据帧和文件路径的dic,例如:
之后,我将读取从中获取值的任何文档,并将它们存储在适当的字典数据框中 完成后,只需将数据保存在csv上,例如:
for file in main_dic:
main_dic[file][data].to_csv('%s.csv' %file, index=False)
希望对您有所帮助每个打开的都是一个嵌套的上下文,只是python语法允许您将它们放在逗号分隔的列表中
contextlib.ExitStack
是一个上下文容器,允许您在堆栈中放入任意数量的上下文,并在完成后退出每个上下文。那么,你可以做什么
import contextlib
files_to_process = (
('Results\\GHCN_Daily\\MetLocations.csv', 'locations'),
('Results\\GHCN_Daily\\Tmax.csv', 'tmax_d'),
('Results\\GHCN_Daily\\Tmin.csv', 'tmin_d'),
# ...
)
with contextlib.ExitStack() as stack:
files = {varname:stack.enter_context(open(filename, 'rb'))
for filename, varname in files_to_process}
# and for instance...
files['locations'].writeline('my location\n')
如果发现dict
access不如属性访问整洁,那么可以创建一个简单的容器类
class SimpleNamespace:
def __init__(self, name_val_pairs):
self.__dict__.update(name_val_pairs)
with contextlib.ExitStack() as stack:
files = SimpleNamespace(((varname, stack.enter_context(open(filename, 'rb')))
for filename, varname in files_to_process))
# and for instance...
files.locations.writeline('my location\n')
以这种方式打开>20个文件是可以的
# your list of file names
file_names = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u']
fh = [] # list of file handlers
for idx,f in enumerate(files):
fileName = f + '.txt'
fh.append(open(fileName,'w'))
# do what you need here
print "done"
for f in fh:
f.close()
虽然不确定您是否真的需要这样做。我不确定它是否适合您想做的工作,但为什么不打开并读取文件,并将其存储在以文件名为键的字典中,工作完成后再写下来?或者你可以制作一份excel工作簿,制作一系列不同的工作表。非常感谢你的评论和建议@aberger。事实上,原始数据是巨大的(47 GB),因此结果表也是巨大的,这就是为什么不可能使用Excel,甚至不可能使用单个Access数据库的原因。谢谢您的评论@hashcode55。我会试试你的建议。我不认为一堆核心数据帧是一个好的解决方案。他只是分散到多个CSV。这会增加内存并降低解决方案的可伸缩性。OP已经有了一个更好的解决方案,只需在处理数据时分散到CSV即可。事实上,我的可伸缩数据非常巨大(47 GB)。这就是为什么我想把它们分成变量。但是OP想把它们放在
with
子句中,这样文件在退出时会自动关闭。。。即使在其中一个文件无法打开的情况下。您的解决方案没有OP想要的功能。非常感谢@tdelaney,这解决了问题。附加说明:我使用Python2.7*,其中contextlib.ExitStack()
不可用。因此,我导入了可选库contextlib2.ExitStack()
。因此,Py2.7用户应该导入contextlib2
,而不是contextlib
。
# your list of file names
file_names = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u']
fh = [] # list of file handlers
for idx,f in enumerate(files):
fileName = f + '.txt'
fh.append(open(fileName,'w'))
# do what you need here
print "done"
for f in fh:
f.close()