0

我有以下代码:

lines[usernum] = str(user) + "\n"         
f = open('users.txt','w')
userstr = str(lines)
f.write(userstr) 

实际上,我正在修改lines列表usernum,然后将其写回原始文件'users.txt'。但是,即使添加“\n”,所有内容都会写入一行,而不是lines. 为什么是这样?

4

3 回答 3

2

那是因为str(lines)不会做你期望它做的事情:

>>> lst = ['This', 'is a\n', 'fancy\n', 'list']
>>> print(str(lst))
['This', 'is a\n', 'fancy\n', 'list']

如您所见,它将写入列表的表示,而不是打印出单独的行。您可以使用str.join来组合列表元素:

lines[usernum] = str(user)
with open('users.txt', 'w') as f:
    f.write('\n'.join(lines))

用作连接字符将'\n'确保在每个列表元素之间插入换行符,因此您无需手动将其添加到每个项目中。

此外,在处理文件时,建议with在打开文件时使用该语句,以确保在处理完文件后正确关闭它们。

于 2013-11-04T11:45:13.523 回答
1

您正在将列表的字符串表示形式写入文件。

Python 容器的字符串表示使用内容的表示,而不是直接写字符串。

使用该writelines()函数编写一个字符串序列:

f.writelines(lines)

或单独编写每一行:

for line in lines:
    f.write(line)

或将这些行连接成一个长字符串:

f.write(''.join(lines))

后者还允许您在编写时添加换行符,将其\n用作连接字符串:

f.write('\n'.join(lines))

where包含没有换行符lines的字符串。

于 2013-11-04T11:43:27.953 回答
1

使用 for 循环并将'\n'每个项目写入新行:

with open('users.txt','w') as f:
    for line in lines:
        f.write('{}\n'.format(line))

调用str()类似listdict简单地返回该对象的str版本的 python 对象,将其内容写入您应该循环的文件。

演示:

lines = [1, 'foo', 3, 'bar']
with open('users.txt','w') as f:
    for line in lines:
        f.write('{}\n'.format(line))
...         
>>> !cat users.txt
1
foo
3
bar
于 2013-11-04T11:43:57.787 回答