你的问题实际上没有意义,因为“线”实际上是什么以及它是什么'\n'
性格的意思。
文件没有内在的行概念。文件只是一个字节序列。'\n'
是行分隔符(Python 用通用换行符表示)。如果您希望数据显示在不同的“行”上,您must在它们之间放置一个行分隔符。这就是全部'\n'
性格是。如果您在编写文件后在文本编辑器中打开该文件,则大多数编辑器默认情况下不会显式显示换行符,因为它已经通过行分隔来表示。
分解你的代码在做什么,让我们看看add
方法,并在此过程中修复一些问题。
第一件事add
所做的就是命名一个名为nl
并为其分配换行符。由此,我可以推测nl
代表“换行符”,但如果它实际上是变量名,那就更好了。
接下来,我们将一个变量命名为acc
并将其分配给'.acc'
后缀,大概是用作文件扩展名之类的。
接下来,我们创建一个变量,名为xy
并将其分配给x + acc
. xy
现在是一个字符串,尽管我不知道它包含变量名称中的内容。有了一些关于什么的知识x
应该是或者这些线代表什么,也许我可以重命名xy
去做一些更有意义的事情。
接下来的三行创建三个新变量,名为exyz
, xyz
, and xxx
,并将它们全部指向同一个字符串xy
参考。这些行中的任何一行都没有任何理由,因为它们的值并没有真正以有意义的方式使用。
现在,我们打开一个文件。美好的。或许tf
代表“文件”? “文本文件”?同样,重命名将使代码更加友好。
现在,我们调用tf.writelines(nl)
. This 写入换行符 ('\n'
) 到文件。自从writelines
方法旨在写入整个字符串列表,而不仅仅是单个字符,如果我们将此调用更改为tf.write(nl)
。我还会更改此设置以在末尾写入换行符,而不是在开头写入,因此第一次写入文件时,它不会在前面插入空行。
接下来,我们调用writelines
再次,使用我们的数据变量(xxx
,但希望已重命名!)。这实际上做的是打破可迭代xxx
(字符串)转换为其组成字符,然后将每个字符写入文件。最好将其替换为tf.write(xxx)
以及。
最后,我们有tf.close
,这是对close
文件对象的功能。这是一个无操作,因为您可能的意思是通过调用以下方法来关闭文件:tf.close()
。我们还可以将文件包装起来 http://effbot.org/zone/python-with-statement.htm as a 上下文管理器 http://docs.python.org/2/reference/datamodel.html#with-statement-context-managers,使其使用更加干净。另外,大多数变量不是必需的:我们可以使用字符串格式化 http://docs.python.org/2/library/string.html#string-formatting一步完成大部分工作。总而言之,您的方法最终可能如下所示:
def add(x):
with open('accounts.dat',"a+") as output_file:
output_file.write('{0}.acc\n'.format(x))
所以你可以看到,原因是'\n'
出现在每行末尾是因为您在每行之间写入它。此外,这是正是你必须做的如果您希望这些行在文本编辑器中显示为“行”。如果没有换行符,所有内容都会显得粉碎在一起(取出'\n'
in my add
上面的方法你自己看看吧!)。
您在评论中描述的问题正在发生,因为names
是直接读取文件。看着readlines文档 http://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects,它返回文件中的行列表,在每个换行符处断开。因此,要清理这些名称,您需要发布代码的第 4 行来调用str.strip http://docs.python.org/2/library/stdtypes.html#str.strip在单独的线路上。你可以这样做:
names = tf.readlines()
for i in range(len(names)):
names[i] = names[i].strip() # remove all the outside whitespace, including \n
然而,它是much更干净、更快并且通常更好地利用 Python列表推导式 http://carlgroner.me/Python/2011/11/09/An-Introduction-to-List-Comprehensions-in-Python.html,以及文件对象已经可以逐行迭代的事实。因此,下面的表达式与前一个表达式等效,但看起来更好:
names = [line.strip() for line in tf]