如何在没有\ n的情况下使用python在文本文件中添加新行

时间:2013-08-05 18:42:19

标签: python python-3.x

我有一个包含文件列表的文件,但最后添加了\n我怎么能让python只在新行上写下我需要的信息而不会得到\n这样我的信息将被称为X.acc而不是x.acc\n?这是我编写文件的代码

def add(x):
    nl = "\n"
    acc = ".acc"
    xy = x + acc
    exyz = xy
    xyz = exyz
    xxx = str(xyz)
    tf = open('accounts.dat',"a+")
    tf.writelines(nl)
    tf.writelines(xxx)
    tf.close

以下是调用文件的代码:

import sys

tf = open('accounts.dat','r')
names = tf.readlines()




u = choicebox(msg="pick something",title = "Choose an account",choices=(names))


counter_file = open(u, 'r+')
content_lines = []

for line in counter_file:
    if line == "credits =":
        creds = line
    else:
        False


for line in counter_file:
        if 'credits =' in line:
                line_components = line.split('=')
                int_value = int(line_components[1]) + 1
                line_components[1] = str(int_value)
                updated_line= "=".join(line_components)
                content_lines.append(updated_line)
        else:
                msgbox(msg=(creds))
                content_lines.append(line)

counter_file.seek(0)
counter_file.truncate()
counter_file.writelines(content_lines)
counter_file.close()

感谢您的帮助,对不起,如果这是一个对python来说还是新手的问题:)

4 个答案:

答案 0 :(得分:14)

你的问题实际上没有意义,因为“线”实际上是什么以及'\n'字符意味着什么。

文件没有内在的线条概念。文件只是一个字节序列。 '\n'是行分隔符(因为Python用通用换行符表示它)。如果您希望数据显示在不同的“行”上,则必须在它们之间放置一个行分隔符。这就是'\n'字符的全部内容。如果在编写文件后在文本编辑器中打开文件,大多数编辑器默认情况下都不会显式显示换行符,因为它已经由行的分隔表示。


要分解您的代码正在做什么,让我们看一下add方法,并修复一些事情。

add做的第一件事是命名一个名为nl的变量,并为其指定换行符。由此可以推测,nl代表“换行符”,但如果它实际上是变量名称会更好。

接下来,我们将一个名为acc的变量命名为'.acc'后缀,可能用作文件扩展名等。

接下来,我们创建一个名为xy的变量,并将其分配给x + accxy现在是一个字符串,但我不知道变量名称包含什么。通过了解x应该是什么或者这些线代表什么,或许我可以将xy重命名为更有意义的东西。

接下来的三行创建了三个名为exyzxyzxxx的新变量,并将它们全部指向xy引用的相同字符串。这些行没有任何理由,因为它们的值并没有真正以有意义的方式使用。

现在,我们打开一个文件。精细。也许tf代表“文件”? “文本文件”?同样,重命名会使代码更加友好。

现在,我们致电tf.writelines(nl)。此将换行符'\n')写入文件。由于writelines方法用于编写整个字符串列表,而不仅仅是单个字符,因此如果我们将此调用更改为tf.write(nl),则会更清晰。我也会改变这一点,在结尾处写下换行符,而不是从头开始,所以第一次写入文件时,它不会在前面插入空行。

接下来,我们使用我们的数据变量(writelines再次调用xxx,但希望这已经重命名!)。这实际上是将可迭代xxx(一个字符串)分解为其组成字符,然后将其中的每一个写入该文件。最好用tf.write(xxx)替换它。

最后,我们有tf.close,它是对文件对象的close函数的引用。这是一个无操作,因为你可能意味着通过调用方法来关闭文件:tf.close()。我们也可以wrap the file up作为context manager,使其使用更清洁。此外,大多数变量都不是必需的:我们可以使用string formatting一步完成大部分工作。总而言之,您的方法在一天结束时可能看起来像这样:

def add(x):
    with open('accounts.dat',"a+") as output_file:
        output_file.write('{0}.acc\n'.format(x))

所以你可以看到,'\n'出现在每一行末尾的原因是因为你是在每一行之间写的。此外,如果您希望行在文本编辑器中显示为“行”,则正是您必须执行的操作。如果没有换行符,所有内容都会显示在一起(请在我上面的'\n'方法中取出add并亲自查看!)。


您在评论中描述的问题正在发生,因为names是对文件的直接读取。查看readlines documentation,它返回文件中的行列表,在每个换行符处断开。因此,要清理这些名称,您需要发布的代码的第4行在各行上调用str.strip。你可以这样做:

names = tf.readlines()
for i in range(len(names)):
    names[i] = names[i].strip() # remove all the outside whitespace, including \n

但是,更多更清洁,更快速,并且通常更好地利用Python的list comprehensions,以及文件对象已经逐行迭代的事实。所以下面的表达式与之前的表达式相同,但看起来更好:

names = [line.strip() for line in tf]

答案 1 :(得分:3)

只需更改添加:

def add(x):
    nl = "\n"
    acc = ".acc"
    xy = x + acc
    exyz = xy
    xyz = exyz
    xxx = str(xyz)
    tf = open('accounts.dat',"a+")
    tf.writelines(xxx)
    tf.writelines(nl)  # Write the newline AFTER instead of before the output
    tf.close()  # close is a function so needs to be called by having () at the end.

查看有关更改内容的评论。

答案 2 :(得分:1)

为什么不用#34; \ n"写一个函数?在行尾。 所以不需要回忆" \ n"每次

我这样做了 -

import os
log_path = r"c:\python27\Logs\log.txt"
if not os.path.exists(r"c:\python27\Logs"):
    os.mkdir(r"c:\python27\Logs")
def write_me_log(text):
    global log_path
    with open(log_path,"a+") as log:
        log.write(text+"\n")
write_me_log("Hello this is the first log text with new line")

答案 3 :(得分:-2)

 file = open("accountfile.txt","a")
file.write(username)
file.write(" ")
file.write(password)
file.write(" ")
file.write(age)
#need it to go down a line here so it writes"hello world" on the next line
file.write("hello world")
file.close()``