将字符串写入另一个文件

时间:2012-07-15 10:06:00

标签: python file

问题 - 更新:

我可以让脚本打印出来但是很难找到一种方法将stdout放入文件而不是屏幕上。下面的脚本用于将结果打印到屏幕上。我在此代码后面发布了解决方案,滚动到底部的[解决方案]。

第一篇文章:

我正在使用Python 2.7.3。我试图在冒号(:)之后提取文本文件的最后一个单词,并将它们写入另一个txt文件。到目前为止,我能够在屏幕上打印结果并且它完美地运行,但是当我尝试将结果写入新文件时,它会给我str has no attribute write/writeline。这是代码片段:

# the txt file I'm trying to extract last words from and write strings into a file
#Hello:there:buddy
#How:areyou:doing
#I:amFine:thanks
#thats:good:I:guess

x = raw_input("Enter the full path + file name + file extension you wish to use: ")
def ripple(x):
  with open(x) as file:
    for line in file:
      for word in line.split():
        if ':' in word:
          try:
            print word.split(':')[-1]
          except (IndexError):
            pass 

ripple(x) 

上面的代码在打印到屏幕时效果很好。但是我花了几个小时阅读Python的文档,似乎无法找到将结果写入文件的方法。我知道如何打开文件并使用writeline,readline等写入文件,但它似乎不适用于字符串。

有关如何实现这一目标的任何建议吗?

PS:我没有添加导致写入错误的代码,因为我认为这会更容易看到。

首发结束

解决方案 - 更新:

管理以获取python以使用下面的代码将其解压缩并保存到另一个文件中。

守则:

inputFile = open ('c:/folder/Thefile.txt', 'r')
outputFile = open ('c:/folder/ExtractedFile.txt', 'w')
tempStore = outputFile
for line in inputFile:
    for word in line.split():
        if ':' in word:
            splitting = word.split(':')[-1]
            tempStore.writelines(splitting +'\n')
            print splitting

inputFile.close()
outputFile.close()

更新

checkout droogans代码超过我的,它更有效率。

3 个答案:

答案 0 :(得分:3)

试试这个:

with open('workfile', 'w') as f:
    f.write(word.split(':')[-1] + '\n')

如果您真的想使用print方法,可以:

from __future__ import print_function
print("hi there", file=f)

根据Correct way to write line to file in Python。如果你使用的是python 2,你应该添加__future__导入,如果你使用的是python 3它已经存在了。

答案 1 :(得分:1)

您正尝试在字符串对象上调用.write()

你要么把你的论点搞砸了(你需要打电话给fileobject.write(yourdata)不是 yourdata.write(fileobject))或者你不小心重复使用了同一个变量目标文件对象并存储字符串。

答案 2 :(得分:1)

我认为你的问题很好,当你完成后,你应该转到code review并查看代码,看看我注意到的其他事情:

# the txt file I'm trying to extract last words from and write strings into a file
#Hello:there:buddy
#How:areyou:doing
#I:amFine:thanks
#thats:good:I:guess

首先,感谢您将示例文件内容放在问题的顶部。

x = raw_input("Enter the full path + file name + file extension you wish to use: ")

我不认为这部分是必要的。您可以为ripple创建比x更好的参数。我认为file_loc是非常标准的。

def ripple(x):
  with open(x) as file:

使用open,您可以标记文件发生的操作。我也想根据它的工作来命名我的文件对象。换句话说,with open(file_loc, 'r') as r:提醒我r.foo将成为我正在阅读的文件。

    for line in file:
      for word in line.split():
        if ':' in word:

首先,您的for word in line.split()语句除了将“Hello:there:buddy”字符串放入列表:["Hello:there:buddy"]之外什么都不做。更好的想法是传递split一个参数,这个参数或多或少会在这里做。例如,"Hello:there:buddy".split(":")会输出['Hello', 'there', 'buddy'],使您搜索冒号成为一项成就任务。

          try:
            print word.split(':')[-1]
          except (IndexError):
            pass 

另一个优点是你不需要检查IndexError,因为你至少会有一个空字符串,当它被拆分时,它会以空字符串的形式返回。换句话说,它不会为该行写任何内容。

ripple(x) 

对于ripple(x),您可以拨打ripple('/home/user/sometext.txt')

因此,请尝试查看此内容,并探索代码审核。有一个名叫Winston的人用Python和自我描述的新手做了非常棒的工作。我总是从那个人那里汲取新的技巧。

以下是我的看法,重新写出:

import os #for renaming the output file

def ripple(file_loc='/typical/location/while/developing.txt'):
    outfile = "output.".join(os.path.basename(file_loc).split('.'))

    with open(outfile, 'w') as w:
        lines = open(file_loc, 'r').readlines() #everything is one giant list
        w.write('\n'.join([line.split(':')[-1] for line in lines]))

ripple()

尝试逐行拆分,改变一切。它非常简洁,但是一旦你掌握了理解并使用列表,以这种方式阅读代码会更自然。