Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.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
如何并行打开19个以上的文件(Python)?_Python_Csv_Nested_With Statement - Fatal编程技术网

如何并行打开19个以上的文件(Python)?

如何并行打开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, \

我有一个项目,需要读取数据,然后根据每行并行写入超过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, \
            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()