我有一个包含文件列表的文件,但最后添加了\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来说还是新手的问题:)
答案 0 :(得分:14)
你的问题实际上没有意义,因为“线”实际上是什么以及'\n'
字符意味着什么。
文件没有内在的线条概念。文件只是一个字节序列。 '\n'
是行分隔符(因为Python用通用换行符表示它)。如果您希望数据显示在不同的“行”上,则必须在它们之间放置一个行分隔符。这就是'\n'
字符的全部内容。如果在编写文件后在文本编辑器中打开文件,大多数编辑器默认情况下都不会显式显示换行符,因为它已经由行的分隔表示。
要分解您的代码正在做什么,让我们看一下add
方法,并修复一些事情。
add
做的第一件事是命名一个名为nl
的变量,并为其指定换行符。由此可以推测,nl
代表“换行符”,但如果它实际上是变量名称会更好。
接下来,我们将一个名为acc
的变量命名为'.acc'
后缀,可能用作文件扩展名等。
接下来,我们创建一个名为xy
的变量,并将其分配给x + acc
。 xy
现在是一个字符串,但我不知道变量名称包含什么。通过了解x
应该是什么或者这些线代表什么,或许我可以将xy
重命名为更有意义的东西。
接下来的三行创建了三个名为exyz
,xyz
和xxx
的新变量,并将它们全部指向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()``