3

问题 - 更新:

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

第一篇文章:

我正在使用 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()

更新:

通过我的结帐 droogans 代码,它更有效。

4

3 回答 3

3

试试这个:

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

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

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

根据在 Python 中将行写入文件的正确方法。如果您使用的是 python 2,则应该添加__future__导入,如果您使用的是 python 3,则它已经存在。

于 2012-07-15T10:10:33.540 回答
1

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

您要么混淆了参数(您需要调用fileobject.write(yourdata)而不是 yourdata.write(fileobject)),要么您不小心将相同的变量重新用于打开的目标文件对象和存储字符串。

于 2012-07-15T10:10:42.230 回答
1

我认为您的问题很好,完成后,您应该前往代码审查并查看您的代码以了解我注意到的其他内容:

# 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: ")

我不认为这部分是必要的。您可以为ripplethan创建一个更好的参数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 

另一个优点是您不需要检查 a 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()

尝试逐行分解它并改变周围的东西。它非常简洁,但是一旦您掌握了推导并使用列表,以这种方式阅读代码会更自然。

于 2012-07-15T17:02:41.200 回答