当前位置: 首页 > 面试题库 >

Writelines写的行没有换行符,只填充文件

闾丘选
2023-03-14
问题内容

我有一个将列表写入文件的程序。该列表是由管道分隔的行的列表,这些行应按如下所示写入文件:

123|GSV|Weather_Mean|hello|joe|43.45
122|GEV|temp_Mean|hello|joe|23.45
124|GSI|Weather_Mean|hello|Mike|47.45

但是它写了他们这行啊:

123|GSV|Weather_Mean|hello|joe|43.45122|GEV|temp_Mean|hello|joe|23.45124|GSI|Weather_Mean|hello|Mike|47.45

该程序将所有行写成一行,而没有任何换行符。.这让我非常痛苦,我必须弄清楚如何将其反转,但是无论如何,我的程序在哪里出错?我认为写行应该在文件下写行,而不是将所有内容都写到一行。

fr = open(sys.argv[1], 'r') # source file
fw = open(sys.argv[2]+"/masked_"+sys.argv[1], 'w') # Target Directory Location

for line in fr:
    line = line.strip()
    if line == "":
        continue
    columns = line.strip().split('|')
    if columns[0].find("@") > 1:
        looking_for = columns[0] # this is what we need to search
    else:
        looking_for = "Dummy@dummy.com"
    if looking_for in d:
        # by default, iterating over a dictionary will return keys
            new_line = d[looking_for]+'|'+'|'.join(columns[1:])
            line_list.append(new_line)
    else:
        new_idx = str(len(d)+1)
        d[looking_for] = new_idx
        kv = open(sys.argv[3], 'a')
        kv.write(looking_for+" "+new_idx+'\n')
        kv.close()
        new_line = d[looking_for]+'|'+'|'.join(columns[1:])
        line_list.append(new_line)
fw.writelines(line_list)

问题答案:

对于刚接触Python的新手来说,这实际上是一个非常普遍的问题-
尤其是因为在标准库和流行的第三方库中,一些阅读功能会删除换行符,但几乎没有书写功能(与-log有关的东西除外)会添加它们。

因此,有很多Python代码可以执行以下操作:

fw.write('\n'.join(line_list) + '\n')

要么

fw.write(line + '\n' for line in line_list)

哪一种是正确的,当然您甚至可以编写自己的writelinesWithNewlines函数来包装它……

但是,只有在无法避免的情况下,才应该这样做。

最好首先创建/保留换行符,如Greg Hewgill的建议:

line_list.append(new_line + "\n")

如esuaro所建议的,例如,可以使用标准库中的csv模块,则可以比文本的原始行更高级地工作,甚至更好。

例如,在定义之后fw,您可以执行以下操作:

cw = csv.writer(fw, delimiter='|')

然后,代替此:

new_line = d[looking_for]+'|'+'|'.join(columns[1:])
line_list.append(new_line)

你来做这件事:

row_list.append(d[looking_for] + columns[1:])

最后,代替这个:

fw.writelines(line_list)

你来做这件事:

cw.writerows(row_list)

最后,您的设计是“打开文件,然后建立要添加到文件中的行列表,然后一次写入所有行”。如果要打开该文件,为什么不只一行一行地写呢?无论您使用的是简单写入还是csv.writer,它都将使您的生活更简单,并且代码也更易于阅读。(有时出于简单,效率或正确性的原因,一次全部写入一个文件,但是一旦您将open所有内容从移到程序的另一端write,您就几乎失去了所有好处。
-一次)。



 类似资料:
  • 我很难理解“文件结尾没有换行”到底是什么意思。 我有 错误指向最后一行 有人可以帮助向我解释为什么我会收到这个无效错误并提供解决它的解决方案。谢谢

  • 我在Adobe Acrobat Pro 2017中创建/编辑了一个PDF。目标是在我们的网站上动态填写它。除了一部分外,它对所有人都是成功的;其中一个表单字段不会按预期包装文本。 这是我用Acrobat Reader 2017手动输入的PDF表单输出 这是代码的输出 这是一个希望匿名的文件版本https://github.com/Wyseguys/wyseguys.github.io/blob/W

  • 问题内容: 考虑以下功能 在下一行中每次添加要写入的内容? 例如,我想要给定字符串的每个单词在单独的lline中,例如: 写道: 问题答案: 要将文本(而不是原始字节)写入文件,应考虑使用FileWriter。您还应该将其包装在BufferedWriter中,这将为您提供newLine方法。 要将每个单词写在新行上,请使用String.split将您的文本分成单词数组。 因此,这是对您的要求的简单

  • 问题内容: 在Python中,调用 产生一个列表,其中每个元素都是文件中的一行。这有点愚蠢,但是仍然:还为每个元素写换行符,这是我不希望发生的事情。 如何避免呢? 问题答案: 您可以使用读取整个文件并分割行: 或者,您可以手动删除换行符: 注意:仅当文件以换行符结尾时,后一种解决方案才有效,否则最后一行将丢失字符。 在大多数情况下,此假设是正确的(尤其是对于文本编辑器创建的文件,这些文件通常确实会

  • 我遇到了以下问题:当手机应该输入时,我需要实现这种情况的解决方案。这部手机应该有不可移动的部分,最后四个数字应该在开头填写下划线,然后当用户键入下划线时,应该将其更改为数字,例如: < code> 12345____ - 我实现了不可移除的部分。我是这样做的: 但现在我不明白,如何处理下划线的逻辑。我尝试在< code>doAfterTextChanged中添加下划线,比如if

  • 问题内容: 我希望在逐个连字符后防止与所有浏览器兼容的换行符。 例: 我有这段文字: 在HTML中是这样的: 问题在于,由于连字符,在行尾附近,它会中断并换行到下一行,而不是像完整的单词一样对待它… 我尝试插入“零宽度不间断字符”,没有运气… 我在Safari中看到了这一点,并认为在所有浏览器中都一样。 以下是我和字符编码… 有什么办法可以防止这些字符在连字符后换行?我不需要适用于整个页面的任何解