3

我有一个包含文件列表的文件,但它\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

4 回答 4

15

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

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


为了分解你的代码在做什么,让我们看一下add方法,并在此过程中修复一些问题。

首先要做的add是命名一个名为的变量nl并为其分配换行符。由此,我可以推测它nl代表“换行符”,但如果这实际上是变量名会更好。

接下来,我们命名一个名为的变量acc并为其分配'.acc'后缀,大概是用作文件扩展名之类的。

接下来,我们创建一个名为的变量xy并将其分配给x + acc. xy现在是一个字符串,虽然我不知道它从变量名中包含什么。有了一些x应该是什么或这些线代表什么的知识,也许我可以重命名xy为更有意义的东西。

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

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

现在,我们调用tf.writelines(nl). 这会将换行符( '\n') 写入文件。由于该writelines方法旨在编写整个字符串列表,而不仅仅是单个字符,因此如果我们将此调用更改为tf.write(nl). 我还会将其更改为在末尾而不是开头写入换行符,因此第一次写入文件时它不会在前面插入空行。

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

最后,我们有了,它是对文件对象函数的tf.close引用。close这是一个无操作,因为您大概的意思是通过调用方法关闭文件:tf.close(). 我们还可以将文件包装上下文管理器,以使其使用更简洁。此外,大多数变量不是必需的:我们可以使用字符串格式化一步完成大部分工作。总而言之,您的方法在一天结束时可能看起来像这样:

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

所以你可以看到,'\n'出现在每行末尾的原因是因为你在每行之间写了它。此外,如果您希望这些行在文本编辑器中显示为“行” ,这正是您必须做的。没有换行符,所有的东西都会显得杂乱无章(拿出'\n'add上面的方法,自己看看!)。


您在评论中描述的问题正在发生,因为names是直接读取文件。查看readlines文档,它返回文件中的行列表,在每个换行处中断。因此,要清理这些名称,您希望发布的代码的第 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 的列表推导,以及文件对象已经可以逐行迭代的事实,它更干净、更快捷,而且通常更好。所以下面的表达式和前面的表达式是等价的,但是看起来要好得多:

names = [line.strip() for line in tf]
于 2013-08-05T18:57:59.880 回答
4

只需更改添加:

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.

请参阅评论以了解已更改的内容。

于 2013-08-05T18:51:17.940 回答
1

为什么不直接在行尾写一个带有“\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")
于 2015-10-17T11:55:00.127 回答
-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()``
于 2018-04-19T10:47:39.023 回答