【问题标题】:Writing to file with newlines in python 3在 python 3 中使用换行符写入文件
【发布时间】:2017-03-23 16:09:50
【问题描述】:

您好,我遇到了这个小问题,我正在从一个文件中读取一些内容,提取一些列并将其写入另一个文件。现在,由于 write() 方法不会在每一行文本之后添加换行符,我通过下面的代码做到了这一点,但这带来了一个问题,它也会在文件末尾添加一个额外的空白行,这不是故意的。

fh.write(string+'\n')

所以我想知道我们如何解决这个问题,下面是我的代码

with open("C:\\test.txt") as fh, open("C:\\newtest","w") as f:
    for line in fh:
        if not re.search("^$",line):
            f.write(line.split()[-1].split(",")[0]+'\n')

所以有什么建议。

【问题讨论】:

  • 跟踪当前行号和总行号,然后将它们相互比较。如果当前行 == 总行数不添加 \n t
  • @kyle 但这又是更多代码,我猜还要在代码中进行另一次检查
  • 如果数据集足够小,那么你可以f.write('\n'.join(line.split()[-1].split(",")[0] for line in fh if not re.search("^$",line))而不是for循环。
  • @AChampion 这似乎不起作用,因为它用换行符连接每个字符串,因此输出是这样的。 d n = " u i d = e e c d l b a c c pd n = " u i d = e e c d l b a c c pd
  • 正常写第一行,后面的行以换行符开头

标签: python


【解决方案1】:

如果您知道您的文件将始终至少有一行,您可以简单地编写第一行而不做任何更改,然后编写所有后续行,并将 \r\n 附加到字符串的开头:

with open("C:\\test.txt") as fh, open("C:\\newtest","w") as f:
    for line in fh:
        if not re.search("^$",line):
            f.write(line.split()[-1].split(",")[0]) #first line with no newline
            break #on first occurance
    for line in fh:
        if not re.search("^$",line):
            f.write('\n'+line.split()[-1].split(",")[0]) #rest of the lines with prepended newline

编辑:

为什么文件没有在第二个循环的第一行重新开始?

在幕后,对象fh 有一些内部状态可以有效地跟踪文件中的“光标”,并且一个称为fh.next() 的特殊方法用于产生下一个值(在这种情况下每行由'\n'分隔。当到达文件末尾时,会引发一种称为StopIteration的特殊异常类型,这是for循环识别的一种特殊异常类型,告诉它退出循环。如果循环使用break 预先退出,文件中的内部光标保持原位,进一步迭代从您离开的地方开始。

您可以通过创建自己的自定义生成器并使用 for 循环对其进行循环来学习迭代如何在幕后工作:

def generator_constructor():
    x = 10
    while x > 0:
        yield x
        x = x - 1 #decrement x

generator = generator_constructor()

print generator.next() #prints 10
print generator.next() #prints 9

print "\nlooping\n" #indicate where we enter the loop

while True: #infinite loop we will need to break out of somehow
    try:
        print generator.next() #print next value
    except StopIteration: #if we reach the end (exit wile loop of generator constructor)
        break #then break out of the loop

尝试使用这段代码并让它做一些更有趣的事情,这样你就可以了解幕后发生的事情

【讨论】:

  • 非常小的疑问,因为我是python的初学者。。第二个for循环不会再次从第一行开始,那么为什么第一行代码没有打印两次???我有点困惑。
  • 非常感谢。我还有一个谜题,我尝试了很多东西,但无法让它工作。我有一个文件 test 包含一些数据,我从这个文件中提取某些值和写入另一个文件newtest。这个newtest 文件没有任何空行,但它包含重复,bt 我只想要 uniq 行。所以我喜欢下面,但它留下了一个尾随\n&,因为它是一个集合它不像你建议的那样工作。 with open("C:\\newtest","r+") as f: lines=[line.rstrip() for line in f] lines=set(lines) f.seek(0) f.truncate() for line in lines: f.write(line+'\n') 任何帮助
  • 我通过将`f.write(line+'\n')`修改为`f.write('\n'.join(lines).lstrip())`解决了这个问题
【解决方案2】:
with open("C:\\test.txt") as fh, open("C:\\newtest","w") as f:
    output_lines = []
    for line in fh:
        if not re.search("^$",line):
            output_lines.append(line.split()[-1].split(",")[0])
    output = '\n'.join(output_lines)
    f.write(output)

甚至

with open("C:\\test.txt") as fh, open("C:\\newtest","w") as f:
    output_lines = [ 
              line.split()[-1].split(",")[0]
              for line in fh
              if not re.search("^$",line)
         ]
    output = '\n'.join(output_lines)
    f.write(output)

【讨论】:

  • 您的行可能会被line.split()[-1].split(",")[0] 评估为一些白色字符。加入不会在最后插入新行
【解决方案3】:

我只是解决了它,我猜这是对编辑器的误解,因为我检查了空行但没有找到。

with open("C:\\test.txt") as fh, open("C:\\newtest","w") as f:
    for line in fh:
        if not re.search("^$",line):
            f.write(line.split()[-1].split(",")[0]+'\n')
fh=open("C:\\ECD Utilization Script - Copy\\newtest","r")
n=0
for line in fh:
    if  re.search("^$",line):
        n=n+1
print(n,"Blank lines")
fh.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2011-06-25
    相关资源
    最近更新 更多