首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结合文件的优雅方式- Python

结合文件的优雅方式- Python
EN

Stack Overflow用户
提问于 2016-05-03 13:29:19
回答 2查看 92关注 0票数 4

嗨,只是一个简单的问题。我有一个连接文件,完美地工作,但这有点混乱。我想知道是否有一种更优雅的方式来写这个:

代码语言:javascript
复制
path = path/to/file/location
with open(path + 'result.txt', 'w') as result, \
        open(path + 'file1.txt') as f1, \
            open(path + 'file2.txt' ) as f2, \
                open(path + 'file3.txt' ) as f3, \
                    open(path + 'file4.txt' ) as f4, \
                        open(path + 'file5.txt' ) as f5, \
                            open(path + 'file6.txt' ) as f6, \
                                open(path + 'file7.txt' ) as f7, \
                                    open(path + 'file8.txt' ) as f8, \
                                        open(path + 'file9.txt' ) as f9, \
                                            open(path + 'file10.txt' ) as f10, \
                                                open(path + 'file11.txt' ) as f11, \
                                                    open(path + 'file12.txt' ) as f12, \
                                                        open(path + 'file13.txt' ) as f13, \
                                                            open(path + 'file14.txt' ) as f14, \
                                                                open(path + 'file15.txt' ) as f15, \
                                                                    open(path + 'file16.txt' ) as f16:
    for line1, line2, line3, line4, line5, line6, line7, line8, \ 
        line9, line10, line11, line12, line13, line14, line15, line16 \
        in zip(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16):

        result.write('{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, \
        {}, {}, {}\n'.format(line1.rstrip(), line2.rstrip(), line3.rstrip(), line4.rstrip(), \
        line5.rstrip(), line6.rstrip(), line7.rstrip(), line8.rstrip(), line9.rstrip(), \
        line10.rstrip(), line11.rstrip(), line12.rstrip(), line13.rstrip(), line14.rstrip(), \
        line15.rstrip(), line16.rstrip()))

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-03 13:46:32

在不使用with的情况下,您总是可以这样做,将文件放在一个列表中,并在所有操作完成后,在循环中手动关闭它们。这还将使format行变得更简单:

代码语言:javascript
复制
path = "path/to/file/location/"
with open(path + 'result.txt', 'w') as result:
    files = [open(path + 'file%d.txt' % (n+1)) for n in range(16)]
    form = ", ".join('{}' for f in files) + '\n'
    for lines in zip(*files):
        result.write(form.format(*map(str.rstrip, lines)))
    for f in files:
        f.close()

或者使用contextlib.ExitStack,如注释中所建议的那样。这样,打开的文件将传递给stack,这将负责在with块之后关闭文件。

代码语言:javascript
复制
with open(path + 'result.txt', 'w') as result, contextlib.ExitStack() as stack:
    files = [stack.enter_context(open(path + 'file%d.txt' % (n+1))) for n in range(16)]
    form = ", ".join('{}' for f in files) + '\n'
    for lines in zip(*files):
        result.write(form.format(*map(str.rstrip, lines)))
票数 4
EN

Stack Overflow用户

发布于 2016-05-03 13:46:39

您可以按顺序处理这些文件(这样可以避免一次打开太多文件的潜在问题):

代码语言:javascript
复制
result_names = ['result1','result2']
result_index = 0
old_result_path = path + "file1.txt"
for n in xrange(2,17):
    new_result_path = path + (result_names[result_index] if n<16 else 'result.txt')
    input_path = path + "file%d.txt" % n
    with open( old_result_path, 'r' ) as old_input, \
        open( input_path, 'r' ) as new_input, 
            open( new_result_path, 'w' ) as result:
       for line1, line2 in zip( old_input, new_input ):
           result.write('{}, {}\n'.format(line1.rstrip(), line2.rstrip())
    old_result_path = new_result_path
    result_index = 1 - result_index

这会让result1.txtresult2.txt躺在地上,你可能关心也可能不关心清理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37005575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档