python文件连接和组合文件

时间:2018-01-09 15:50:34

标签: python string concatenation

我的主要问题是:

我有一组文件,我在python中以这种方式连接它们:

   sys.stdout=open("out.dat","w")
filenames = ['bla.txt', 'bla.txt', 'bla.txt']
with open('out.dat', 'w') as outfile:
    for fname in filenames:
        with open(fname) as infile:
            outfile.write(infile.read())
with open('out.dat') as f:
    print "".join(line.strip() for line in f)  
sys.stdout.close()

bla.txt文件看起来像

  

AAA

目的是让它看起来像

  

aaaaaaaaa

(相同字符串的3倍,每次都不在新行上......)

由于某些原因,我所做的事情会产生一个看起来像

的输出
  

AAAAAA

     

我不确定为什么会这样,如果有更简单/更优雅的解决方案。

更多的第二个问题是,最终,我的计划是拥有许多不同的文件(例如字母三元组),我可以在所有可能的组合中连接:aaabbbccc,aaacccbbb,...等等

任何指导赞赏!谢谢!

2 个答案:

答案 0 :(得分:2)

您的代码有一些令人困惑的事情,我会在各自的地方留下一些评论:

.value

我能想到的最简约的方法:

HTMLInputElement

至于您的错误,不应该发生错误,您是否确认# Not sure what is reason for this sys.stdout=open("out.dat","w") filenames = ['bla.txt', 'bla.txt', 'bla.txt'] # This does what you need with open('out.dat', 'w') as outfile: for fname in filenames: with open(fname) as infile: outfile.write(infile.read()) # Here, you open `out.dat` and rewrites it content back into it - # because you made `sys.stdout = open("out.dat", "w")` above. # All these lines could be removed (along with `sys.stdout` assignment above) with open('out.dat') as f: print "".join(line.strip() for line in f) sys.stdout.close() 的内容正好是# Open output with open('out.dat', 'w') as outfile: # Iterate over each input for infilename in ['bla.txt'] * 3: # Open each input and write it to output with open(infilename) as infile: outfile.write(infile.read())

答案 1 :(得分:1)

Nihey Takizawa的帖子几乎回答了为什么你有这个错误。首先,让我们看看程序执行的每一步发生了什么。

sys.stdout=open("out.dat","w")

这非常重要。因为用文件处理程序将stdout替换为“out.dat”,所以使用它的每个内部函数或语句将从现在开始写入“out.dat”。

with open('out.dat', 'w') as outfile:
    for fname in filenames:
        with open(fname) as infile:
            outfile.write(infile.read())

在此块之后,文件“out.dat”的内容为:

aaa
aaa 
aaa

...或换句话说:aaa\naaa\naaa\n其中\n代表换行的单个字符。字符数:12(9次a次和3次换行\n)。

with open('out.dat') as f:
    print "".join(line.strip() for line in f)

这是重要的事情。请记住,因为在步骤1中,您已将sys.stdout更改为“out.dat”,内部函数print将输出写入“out.dat”。

您删除每一行并加入它们,因此您将“aaaaaaaaa”写入“out.dat”。

1  2  3  4  5  6  7  8  9 10 11 12
a  a  a \n  a  a  a \n  a  a  a \n  # this is content of the file before print
a  a  a  a  a  a  a  a  a \n       # that you write, 9 a chars + \n
                                   # which is added by print function by default

请注意,您已经替换了12个字符中的10个并关闭了文件,因此11和12个字符将保持不变。结果是你的输出。

解决方案? 从不搞乱像更改sys.stdout文件处理程序之类的东西,除非你知道你在做什么。

编辑:如何修复代码。 我认为Nihey Takizawa很好地解释了如何修复你的代码,但实际上并不完全正确。这是解决方案:

filenames = ['bla.txt', 'bla.txt', 'bla.txt']
with open('out.dat', 'w') as outfile:
    for fname in filenames:
        with open(fname) as infile:
            outfile.write(infile.read().strip())

现在,您的out.dat文件只包含aaaaaaaaa字符串,没有换行符。