问题 - 更新:
我可以让脚本打印出来但是很难找到一种方法将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代码超过我的,它更有效率。
答案 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()
尝试逐行拆分,改变一切。它非常简洁,但是一旦你掌握了理解并使用列表,以这种方式阅读代码会更自然。