每次将字符串写入新行的文件

Posted

技术标签:

【中文标题】每次将字符串写入新行的文件【英文标题】:Writing string to a file on a new line every time 【发布时间】:2011-02-24 11:47:34 【问题描述】:

每次调用file.write() 时,我都想在字符串中添加一个换行符。在 Python 中最简单的方法是什么?

【问题讨论】:

【参考方案1】:

使用“\n”:

file.write("My String\n")

参考the Python manual。

【讨论】:

如果你使用变量来组成记录,你可以在最后加上+“\n”,比如fileLog.write(var1 + var2 + "\n")。 在较新版本的 Python (3.6+) 中,您也可以只使用 f 字符串:file.write(f"var1\n") 或 file.write(f'var1\n') 加单引号 如果我们需要回调怎么办?【参考方案2】:

您可以通过两种方式做到这一点:

f.write("text to write\n")

或者,取决于您的 Python 版本(2 或 3):

print >>f, "text to write"         # Python 2.x
print("text to write", file=f)     # Python 3.x

【讨论】:

我正在使用 f.writelines(str(x)) 写入 x 为列表的文件,现在告诉如何将列表 x 写入文件以应对从新行开始的每个列表跨度> @kaushik: f.write('\n'.join(x)) 或 f.writelines(i + '\n' for i in x) 我认为 f.write 方法更好,因为它可以在 Python 2 和 3 中使用。【参考方案3】:

你可以使用:

file.write(your_string + '\n')

【讨论】:

你可以使用这种用法,例如,当你将一个int写入文件时,你可以使用file.write(str(a)+'\n') @xikhari 为什么? file.write(f"my number is: number\n") 很好并且可读。【参考方案4】:

如果你广泛使用它(很多书面行),你可以继承'file':

class cfile(file):
    #subclass file to have a more convienient use of writeline
    def __init__(self, name, mode = 'r'):
        self = file.__init__(self, name, mode)

    def wl(self, string):
        self.writelines(string + '\n')

现在它提供了一个额外的函数 wl 来满足你的需求:

with cfile('filename.txt', 'w') as fid:
    fid.wl('appends newline charachter')
    fid.wl('is written on a new line')

也许我遗漏了不同的换行符(\n、\r、...)之类的东西,或者最后一行也以换行符结尾,但它对我有用。

【讨论】:

在这种情况下您不需要return None,因为首先,您不需要它,其次,当没有return 语句时,每个Python 函数默认返回None 这是一个很好的解决方案,老实说file 应该将其作为参数,在文件打开时应用。【参考方案5】:

你可以这样做:

file.write(your_string + '\n')

正如另一个答案所建议的那样,但是当您可以两次调用file.write 时,为什么要使用字符串连接(缓慢、容易出错):

file.write(your_string)
file.write("\n")

请注意,写入是缓冲的,所以它相当于同一件事。

【讨论】:

【参考方案6】:

另一种使用 fstring 从列表中写入的解决方案

lines = ['hello','world']
with open('filename.txt', "w") as fhandle:
  for line in lines:
    fhandle.write(f'line\n')

作为一个函数

def write_list(fname, lines):
    with open(fname, "w") as fhandle:
      for line in lines:
        fhandle.write(f'line\n')

write_list('filename.txt', ['hello','world'])

【讨论】:

【参考方案7】:
file_path = "/path/to/yourfile.txt"
with open(file_path, 'a') as file:
    file.write("This will be added to the next line\n")

log_file = open('log.txt', 'a')
log_file.write("This will be added to the next line\n")

【讨论】:

使用“a”而不是“w”作为参数打开文件不会改变写入函数以按照您描述的方式工作。它的唯一作用是文件不会被覆盖,并且文本将添加到最底部的行,而不是从空白文件的左上角开始。【参考方案8】:

除非写入二进制文件,否则使用 print。以下示例适用于格式化 csv 文件:

def write_row(file_, *columns):
    print(*columns, sep='\t', end='\n', file=file_)

用法:

PHI = 45
with open('file.csv', 'a+') as f:
    write_row(f, 'header', 'phi:', PHI, 'serie no. 2')
    write_row(f)  # additional empty line
    write_row(f, data[0], data[1])

注意事项:

print documentation ', '.format(1, 'the_second') - https://pyformat.info/, PEP-3101 '\t' - 制表符 *columns 在函数定义中 - 将任意数量的参数发送到列表 - 参见 question on *args & **kwargs

【讨论】:

【参考方案9】:

请注意,file 不支持 Python 3 并已被删除。您可以使用 open 内置函数执行相同操作。

f = open('test.txt', 'w')
f.write('test\n')

【讨论】:

【参考方案10】:

print() 语句上使用append (a)open() 对我来说看起来更容易:

save_url  = ".\test.txt"

your_text = "This will be on line 1"
print(your_text, file=open(save_url, "a+"))

another_text = "This will be on line 2"
print(another_text, file=open(save_url, "a+"))

another_text = "This will be on line 3"
print(another_text, file=open(save_url, "a+"))

【讨论】:

【参考方案11】:

这是我想出的解决方案,试图为自己解决这个问题,以便系统地生成 \n 作为分隔符。它使用字符串列表写入,其中每个字符串都是文件的一行,但它似乎也适用于您。 (Python 3.+)

#Takes a list of strings and prints it to a file.
def writeFile(file, strList):
    line = 0
    lines = []
    while line < len(strList):
        lines.append(cheekyNew(line) + strList[line])
        line += 1
    file = open(file, "w")
    file.writelines(lines)
    file.close()

#Returns "\n" if the int entered isn't zero, otherwise "".
def cheekyNew(line):
    if line != 0:
        return "\n"
    return ""

【讨论】:

为什么不简单地with open(path, "w") as file: for line in strList: file.write(line + "\n")?这样你就可以删除所有的列表工作,检查,并且只有 3 行。【参考方案12】:

我真的不想每次都输入\n 而@matthause's answer 似乎对我不起作用,所以我创建了自己的类

class File():

    def __init__(self, name, mode='w'):
        self.f = open(name, mode, buffering=1)
        
    def write(self, string, newline=True):
        if newline:
            self.f.write(string + '\n')
        else:
            self.f.write(string)

这里实现了

f = File('console.log')

f.write('This is on the first line')
f.write('This is on the second line', newline=False)
f.write('This is still on the second line')
f.write('This is on the third line')

这应该在日志文件中显示为

This is on the first line
This is on the second lineThis is still on the second line
This is on the third line

【讨论】:

【参考方案13】:

好的,这是一种安全的方法。

with open('example.txt', 'w') as f:
 for i in range(10):
  f.write(str(i+1))
  f.write('\n')


这会将 1 到 10 的每个数字写成新的一行。

【讨论】:

【参考方案14】:

您可以在需要此行为的特定位置装饰方法写入:

#Changed behavior is localized to single place.
with open('test1.txt', 'w') as file:    
    def decorate_with_new_line(method):
        def decorated(text):
            method(f'text\n')
        return decorated
    file.write = decorate_with_new_line(file.write)
    
    file.write('This will be on line 1')
    file.write('This will be on line 2')
    file.write('This will be on line 3')

#Standard behavior is not affected. No class was modified.
with open('test2.txt', 'w') as file:
        
    file.write('This will be on line 1')
    file.write('This will be on line 1')
    file.write('This will be on line 1')  

【讨论】:

【参考方案15】:

通常您会使用 \n,但无论出于何种原因,在 Visual Studio Code 2019 个人版中它都不起作用。但是你可以使用这个:

# Workaround to \n not working
print("lorem ipsum", file=f) **Python 3.0 onwards only!**
print >>f, "Text" **Python 2.0 and under**

【讨论】:

【参考方案16】:

如果 write 是回调,则可能需要自定义 writeln。

  def writeln(self, string):
        self.f.write(string + '\n')

它本身在一个自定义开瓶器中。查看此问题的答案和反馈:subclassing file objects (to extend open and close operations) in python 3

(上下文管理器)

我在使用 ftplib 从“基于记录”(FB80) 的文件中“检索行”时遇到了这个问题:

with open('somefile.rpt', 'w') as fp:
     ftp.retrlines('RETR USER.REPORT', fp.write)

最后得到一个没有换行符的长记录,这可能是 ftplib 的问题,但很模糊。

所以变成了:

with OpenX('somefile.rpt') as fp:
     ftp.retrlines('RETR USER.REPORT', fp.writeln) 

它完成了这项工作。这是一个少数人会寻找的用例。

完整的声明(只有最后两行是我的):

class OpenX:
    def __init__(self, filename):
        self.f = open(filename, 'w')

    def __enter__(self):
        return self.f

    def __exit__(self, exc_type, exc_value, traceback):
        self.f.close()

    def writeln(self, string):
        self.f.write(string + '\n')

【讨论】:

以上是关于每次将字符串写入新行的文件的主要内容,如果未能解决你的问题,请参考以下文章

贝加莱PLC。写入后计算新偏移量或如何将数据写入新行

每次按下“写入”按钮时如何将字符串行写入文件

python列表到csv文件,每个项目都在新行中

使用 Apache Spark 和 Java 按列分组并将每组字符串写入文本文件

观看/阅读不断增长的日志文件

如何使用 fast-csv npm 将新行或新行的数据(新行)附加到现有的 csv 文件