Python 如何将字符串列表写入文件,添加换行符?

Python 如何将字符串列表写入文件,添加换行符?,python,file-io,newline,Python,File Io,Newline,我想在每个“c+n”后面加一个换行符 正确放置的数据。write('\n')将处理该问题。只需根据要标点的循环将其适当缩进即可 def generator(): nums = ['09', '98', '87', '76', '65', '54', '43'] s_chars = ['*', '&', '^', '%', '$', '#', '@',] data = open("list.txt", "w") for c in s_chars:

我想在每个“c+n”后面加一个换行符

正确放置的
数据。write('\n')
将处理该问题。只需根据要标点的循环将其适当缩进即可

def generator():
    nums = ['09', '98', '87', '76', '65', '54', '43']
    s_chars = ['*', '&', '^', '%', '$', '#', '@',]

    data = open("list.txt", "w")
    for c in s_chars:
        for n in nums:
            data.write(c + n)
    data.close()

取决于你想要什么。

改变

def generator():
     nums = ['09', '98', '87', '76', '65', '54', '43']
     s_chars = ['*', '&', '^', '%', '$', '#', '@',]

     data = open("list.txt", "w")
     for c in s_chars:
        for n in nums:
           data.write(c + n)
        data.write("\n")
     data.close()
print(c+n, file=data)


正如已经给出的其他答案所指出的,您可以通过在
c+n
中添加“\n”或使用格式字符串“%s%s\n”来完成此操作

有趣的是,我认为使用列表理解而不是两个嵌套循环更符合Python:

data.write("%s%s\n" % (c, n))

在之前的回复中,我的回答是错误的,因为我误解了要求,请忽略它

我认为您可以使用
join
来简化内部循环

data.write("\n".join("%s%s"%(c,n) for c in s_chars for n in nums))

Python的
print
是标准的“使用换行符打印”函数

因此,如果使用Python 2.x,您可以直接执行以下操作:

data = open("list.txt", "w")
for c in s_chars:
    data.write("%s%s\n" % (c, c.join(nums)))
data.close()
如果使用Python 3.x:

print  >> data, c+n
改变

这个适合我

data.write(c+n+'\n')

使用
writelines
product
将更多工作推送到C层:

with open(fname,'wb') as f:
    for row in var:
        f.write(repr(row)+'\n')

这会产生与嵌套循环相同的效果,但使用C实现的内置程序(无论如何,在CPython引用解释器中)会产生相同的效果,从而消除了图片中的字节码执行开销;这可以显著提高性能,特别是对于较大的输入,并且与涉及
“\n”的其他解决方案不同。将整个输出的
连接到单个字符串中,以执行单个
写入
调用,它在写入时进行迭代,因此,峰值内存使用率保持不变,而不是要求您在一个字符串中一次性实现内存中的整个输出。

您可以添加一个示例,说明您希望输出的外观吗?现在还不清楚要在哪里添加换行符。在写出之前,这不会在内存中构造整个字符串吗?@detly:是的。在这种情况下,生成的字符串应该足够短。只要有足够的内存,速度应该会快一些。@detly:我添加的正是为了解决这个问题。知道
writelines
的人太少了。我的答案使用额外的内置函数将所有工作推送到C,但是这个答案仍然可以通过一个小小的调整获得峰值内存使用率降低的好处:
data.writelines(“%s%s\n”%(C,n)表示C in s\u chars表示n in nums)
zip()
不等同于两个嵌套循环……抱歉,我误解了这个要求。我已经更正了我的答案。这比简单的
打印版
要复杂得多,它的设计正好符合原始海报的要求。@Ignacio:我确实不会说
data.write('\n')
是“错的”。然而,我确实认为它与Python的禅宗格格不入(“应该有一种——最好只有一种——显而易见的方式来做”):因为
print
是为了添加换行符而设计的,所以我觉得在这种情况下不使用它真的很奇怪。@EOL:我不同意
print
是这里“显而易见”的方式。为了在Python2.x下使用带有文件句柄的
print
,您必须知道重定向操作符
>
,它在语言的任何其他地方都不会使用。打印V形符号只是
write()
的语法糖
file.write()
用于将(简单的)数据放入文件,而不考虑这些数据的内容。在Python3中,我可能会同意你的观点。@Josh:很公平。:)另一方面,Python2.x中的雪佛龙操作符在有许多换行符分隔的行要打印到文件时是必须的:执行
print>>…,…
比执行大量
…write(“%s\n”%…)
要轻得多。它也可以说更清晰,因为它意味着“我正在用换行符打印行”,而
write()
中的格式字符串在得出这个结论之前必须进行视觉分析。不知道“打火机”是什么意思。然而,我确实明白并放弃了你关于易读性的观点;这是一个很好的看待它的方式。
data.write(c+n)
data.write(c+n+'\n')
with open(fname,'wb') as f:
    for row in var:
        f.write(repr(row)+'\n')
from future_builtins import map  # Only do this on Python 2; makes map generator function
import itertools

def generator():
    nums = ['09', '98', '87', '76', '65', '54', '43']
    s_chars = ['*', '&', '^', '%', '$', '#', '@',]
    # Append newlines up front, to avoid doing the work len(nums) * len(s_chars) times
    # product will realize list from generator internally and discard values when done
    nums_newlined = (n + "\n" for s in nums)

    with open("list.txt", "w") as data:
        data.writelines(map(''.join, itertools.product(s_chars, nums_newlined)))