如何并行打开超过19个文件(Python)?

时间:2017-01-24 15:40:07

标签: 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, \
            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

我搜索了这个错误,然后我到this post说了

  

嵌套块超过20时,您将遇到此错误。   这是Python解释器将其限制为20的设计决定。

但是我写的open语句并行打开文件,而不是嵌套。

我做错了什么,我该如何解决这个问题?

提前致谢。

4 个答案:

答案 0 :(得分:3)

每个open都是一个嵌套的上下文,它只是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访问权限比属性访问权限更少,则可以创建一个简单的容器类

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')

答案 1 :(得分:1)

我会有一个可能的文件列表= ['湿度','温度',...]
制作包含可能的文件,数据帧,文件路径的dic,例如:

main_dic = {}

for file in possible_files:

    main_dic[file][path] = '%s.csv' %file
    main_dic[file][data] = pd.DataFrame([], columns=['value','other_column','another_column', ....])

之后,我将阅读您从中获取值的任何文档并将其存储在正确的字典数据框中。

完成后只需将数据保存在csv上,例如:

for file in main_dic:

     main_dic[file][data].to_csv('%s.csv' %file, index=False)

希望有所帮助

答案 2 :(得分:0)

如果数据不是很大,为什么不读取所有数据并按类别对数据进行分组(例如将所有关于温度的数据放入一个组中),然后一次性将分组数据写入相应的文件?

答案 3 :(得分:-1)

以这种方式打开> 20个文件是可以的。

{{1}}

虽然不确定你是否真的需要这样做。