Python保存到文件

115
我想使用一个名为Failed.py的Python程序将字符串保存到文件中。目前我的代码如下:
myFile = open('today','r')

ips = {}

for line in myFile:
    parts = line.split(' ')
    if parts[1] == 'Failure':
        if parts[0] in ips:
            ips[pars[0]] += 1
        else:
            ips[parts[0]] = 0

for ip in [k for k, v in ips.iteritems() if v >=5]:
    #write to file called Failed.py

2
纯粹出于好奇:有没有办法将一个答案变成被接受的答案?(Stefan 似乎已经多年不活跃了) - Wolf
实际问题是什么? - user207421
5
@Wolf 不,这是有意为之的。打勾的意义不是“这是唯一正确的答案”,而是“这个回答让提问者满意”。没有被打勾的好答案仍然有用。请注意不要改变原意并尽量使用通俗易懂的语言。 - rumtscho
5个回答

237
file = open('Failed.py', 'w')
file.write('whatever')
file.close()

下面是更具有Python风格的代码,它可以自动关闭文件,即使在包装块中出现异常:

with open('Failed.py', 'w') as file:
    file.write('whatever')

2
在Python中,“file”不是受保护的关键字,因此无需使用“file_”,除非您的编码风格指南要求在任何上下文(文件、函数、类、方法)中对变量使用“_”后缀。 - zstewart
7
不是关于编码风格的问题。file是一个内置函数,就像许多其他函数一样。不建议使用其他变量来掩盖这些内置函数,详情请参考此处 - warvariuc
1
“file”在Python 3中已被弃用并移除,因此在那里使用是完全可以的。我没有看到问题上的2.7标签,而我通常使用Python 3... - zstewart
1
我喜欢在这种情况下使用一行代码:open('Failed.py', 'w').write('whatever') - Anatoly Vasilyev
2
@Anatoly,你没有关闭文件。 - warvariuc
3
@warvariuc 谢谢,你说得对,那么这似乎不是最佳实践。 - Anatoly Vasilyev

23

你需要再次使用 open() 打开文件,但这次要传递 'w' 以表示你想写入文件。我还建议使用 with 来确保在完成写入后文件将被关闭。

with open('Failed.txt', 'w') as f:
    for ip in [k for k, v in ips.iteritems() if v >=5]:
        f.write(ip)

当然,你可能希望在输出中包含换行或其他格式,但基础步骤就像上面所示。

关闭文件时也适用于读取代码。应该看起来像这样:

ips = {}
with open('today','r') as myFile:
    for line in myFile:
        parts = line.split(' ')
        if parts[1] == 'Failure':
            if parts[0] in ips:
                ips[pars[0]] += 1
            else:
                ips[parts[0]] = 0

3
为了在Python中写入文件,我们需要使用写入w、追加a或独占创建x模式打开它。
需要注意的是,如果以w模式打开文件,会覆盖掉已经存在的文件,因此所有先前的数据都会被清除。
使用write()方法可以写入字符串或字节序列(用于二进制文件)。此方法返回写入文件的字符数。
with open('Failed.py','w',encoding = 'utf-8') as f:
   f.write("Write what you want to write in\n")
   f.write("this file\n\n")

如果当前目录下不存在名为Failed.py的文件,则该程序将创建一个新文件。如果存在同名文件,则会覆盖原有文件。

我们必须自己添加换行符以区分不同的行。


2
你可以使用这个函数:
def saveListToFile(listname, pathtosave):
    file1 = open(pathtosave,"w") 
    for i in listname:
        file1.writelines("{}\n".format(i))    
    file1.close() 

# to save:
saveListToFile(list, path)

我认为添加异常处理程序是一个好主意。当文件不存在、磁盘已满、格式错误等情况出现时,这将避免程序崩溃。 - Hacky

1
myFile = open('today','r')

ips = {}

for line in myFile:
    parts = line.split()
    if parts[1] == 'Failure':
        ips.setdefault(parts[0], 0)
        ips[parts[0]] += 1

of = open('failed.py', 'w')
for ip in [k for k, v in ips.iteritems() if v >=5]:
    of.write(k+'\n')

看看 setdefault,它可以让代码更易读。然后使用文件对象的写入方法来转储数据。


1
没错,他说的对。在那里加上一个 of.close。否则你就假设 GC 会关闭文件。显式优于隐式。谢谢。 - jaime
1
@jaime 实际上你需要做的不仅仅是调用 close。你需要在一个 finally 块中进行,以防止异常。惯用的方法是使用一个 with 上下文处理器。 - David Heffernan
1
是的,谢谢。我也想到了这一点,但我担心最终被调用时需要解释。然后在阅读了您的评论后,我意识到他标记了问题为python-2.7。谢谢。 - jaime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接