gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:43:16 25 4
gpt4 key购买 nike

我有一个项目需要读取数据,然后根据每一行并行写入超过 23 个 CSV 文件。例如,如果该行是关于温度的,我们应该写入Temperature.csv,如果是关于湿度的,则应该写入>>humid.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上面说的是

You will encounter this error when you nest blocks more than 20. This is a design decision of Python interpreter to restrict it to 20.

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

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

提前致谢。

最佳答案

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

关于python - 如何并行打开超过 19 个文件(Python)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41832249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com