gpt4 book ai didi

python - Python中与 block 嵌套,嵌套变量的级别

转载 作者:行者123 更新时间:2023-12-01 05:09:20 25 4
gpt4 key购买 nike

我想将各种 csv 文件的列合并到一个 csv 文件中,并带有一个新标题,水平连接。我只想选择某些列,按标题选择。每个要合并的文件中有不同的列。

输入示例:

freestream.csv:

static pressure,static temperature,relative Mach number
1.01e5,288,5.00e-02

粉丝.csv:

static pressure,static temperature,mass flow
0.9e5,301,72.9

排气.csv:

static pressure,static temperature,mass flow
1.7e5,432,73.1

期望的输出:

组合.csv:

P_amb,M0,Ps_fan,W_fan,W_exh
1.01e5,5.00e-02,0.9e6,72.9,73.1

可能调用该函数:

reorder_multiple_CSVs(["freestream.csv","fan.csv","exhaust.csv"],
"combined.csv",["static pressure,relative Mach number",
"static pressure,mass flow","mass flow"],
"P_amb,M0,Ps_fan,W_fan,W_exh")

这是代码的先前版本,仅允许一个输入文件。我在 write CSV columns out in a different order in Python 的帮助下写了这篇文章:

def reorder_CSV(infilename,outfilename,oldheadings,newheadings):
with open(infilename) as infile:
with open(outfilename,'w') as outfile:
reader = csv.reader(infile)
writer = csv.writer(outfile)
readnames = reader.next()
name2index = dict((name,index) for index, name in enumerate(readnames))
writeindices = [name2index[name] for name in oldheadings.split(",")]
reorderfunc = operator.itemgetter(*writeindices)
writer.writerow(newheadings.split(","))
for row in reader:
towrite = reorderfunc(row)
if isinstance(towrite,str):
writer.writerow([towrite])
else:
writer.writerow(towrite)

因此,为了使其适应多个文件,我发现的是:

-我现在需要 infilename、oldheadings 和 newheadings 成为一个列表(长度均相同)

-我需要迭代输入文件列表以创建读者列表

-readnames 也可以是一个列表,迭代读者

- 这意味着我可以使 name2index 成为字典列表

有一件事我不知道该怎么做,那就是使用关键字 with,嵌套 n 层,而 n 仅在运行时已知。我读到了这个:How can I open multiple files using "with open" in Python?但这似乎只有当您知道需要打开多少个文件时才有效。

或者有更好的方法吗?

我对 python 很陌生,所以我很感谢你能给我的任何提示。

最佳答案

我只是回复with打开多个文件的部分,之前文件的数量是未知的。编写自己的 contextmanager 应该不会太难,像这样(完全未经测试):

from contextlib import contextmanager

@contextmanager
def open_many_files(filenames):
files = [open(filename) for filename in filenames]
try:
yield files
finally:
for f in files:
f.close()

你会这样使用:

innames = ['file1.csv', 'file2.csv', 'file3.csv']
outname = 'out.csv'
with open_many(innames) as infiles, open(outname, 'w') as outfile:
for infile in infiles:
do_stuff(in_file)

还有一个函数does something similar ,但它已被弃用。

关于python - Python中与 block 嵌套,嵌套变量的级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24512785/

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