【问题标题】:How to create a text file in python without csv.writer?如何在没有 csv.writer 的情况下在 python 中创建文本文件?
【发布时间】:2011-01-27 15:35:09
【问题描述】:

我需要一个带有 txt 扩展名的逗号分隔的 txt 文件。 "a,b,c"

我使用 csv.writer 创建了一个 csv 文件更改了扩展名。另一个编不会使用/处理数据。我试过“wb”、“w”。

F = open(Fn, 'w')
w = csv.writer(F)
w.writerow(sym)
F.close()

用记事本打开---这些是完整的文件。 他们的文件:使用他们的 gui 创建的使用了三个符号

PDCO,ICUI,DVA

我的文件:使用 python 创建的

PDCO,ICUI,DVA

测试:打开他们的文件 - 工作,打开我的文件 - 失败。 简单的打开和关闭,保存在记事本中。打开我的文件——有效

Works= 'PDCO,ICUI,DVA' 
Fails= 'PDCO,ICUI,DVA\r\r\n' 

编辑:在没有 Cvs writer 的情况下编写 txt 文件.....

sym = ['MHS','MRK','AIG']

with open(r'C:\filename.txt', 'w') as F:    # also try 'w'
    for s in sym[:-1]:                      # separate all but the last
        F.write(s + ',')                    # symbols with commas
        F.write(sym[-1])                    # end with the last symbol

【问题讨论】:

  • 那么你的问题到底是什么?我还不太明白,请尝试更具体。
  • 您面临的问题是什么? .csv 也是 .txt 文件(只是扩展名不同)。
  • “只是忽略它”?这可能意味着什么?
  • @user428862。 “忽略”?没上传?没处理?没有提供错误信息?浏览器崩溃?你的电脑崩溃了?服务器崩溃了? “忽略”不是一个有用的词。
  • 我不清楚在记事本中打开文件并粘贴内容是否会有所帮助。显然,文件之间的差异没有显示在记事本中,或者 OP 不需要我们的帮助;可能记事本正在以某种方式默默地更改文件。我的建议是在十六进制编辑器中打开文件;但我不知道 Windows 十六进制编辑器。

标签: python csv text-files


【解决方案1】:

在我看来,您似乎并不完全了解您的第三方应用程序输入格式。如果 .CSV 没有被重新整理,它可能是别的东西。

您是否尝试更改分隔符 fromn ';'到“,”

import csv
spamWriter = csv.writer(open('eggs.csv', 'wb'), delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

看看CSV Python API

【讨论】:

    【解决方案2】:

    我认为问题在于您的文件写入模式,根据CSV file written with Python has blank lines between each row

    如果您像这样创建 csv 文件

    csv.writer(open('myfile.csv', 'w'))
    

    csv.writer 以 '\r\n' 结束其行,然后 Python 的文本文件处理(在 Windows 机器上)将 '\n' 转换为 '\r\n',导致行以 '\r\ r\n'。许多程序会因此而窒息;记事本将其识别为问题并删除了多余的“\r”。

    如果你使用

    csv.writer(open('myfile.csv', 'wb'))
    

    它会产生预期的 '\r\n' 行结尾,它应该可以按需要工作。

    编辑: @senderle 有一个很好的观点;尝试以下方法:

    goodf = open('file_that_works.txt', 'rb')
    print repr(goodf.read(100))
    badf =  open('file_that_fails.txt', 'rb')
    print repr(badf.read(100))
    

    将结果粘贴到这里,这样我们就可以看到两者是如何逐字节比较的。

    【讨论】:

    • 我拿了python创建的文件。用记事本打开,保存。第三方 gui 读取它。
    • @user428862:详细信息,已经!文件名?文件扩展名?更改文件扩展名解决了问题?如果你一开始就用正确的扩展名创建了文件,还需要用记事本重新保存吗?
    • 对不起.. 不,相同的文件名。相同的扩展名。只是打开文件并关闭,没有别的。文件名和扩展名不是问题。我猜记事本是如何保存的 vs python 创建的……一些东西
    • 好的!现在我们到了某个地方;所以它可能是文件的文本编码。您是否使用任何奇怪的字符集、unicode 等?加载记事本之前的文件时是否收到任何类型的错误消息?
    • \r\r\n 说 open(filename, 'w') 是问题所在, open(filename, 'wb') 应该解决它。 “失败”没有帮助;什么失败了?失败怎么办?你怎么知道失败了?它做了什么不该做的事,或者不该做的事?是否有任何错误消息?
    【解决方案3】:

    试试这个:

    with open('file_that_works.csv', 'rb') as testfile:     # file is automatically
        d = csv.Sniffer().sniff(testfile.read(1024))        # closed at end of with
                                                            # block
    with open(Fn, 'wb') as F:       # also try 'w'
        w = csv.writer(F, dialect=d)
        w.writerow(sym)
    

    进一步解释:这会查看一个工作 .csv 文件的样本并推断其格式。然后它使用该格式编写一个新的 .csv 文件,希望不必在记事本中重新保存。


    编辑:如果您使用的程序不接受多行输入 (?!),则不要使用 csv。只需执行以下操作:

    syms = ['JAGHS','GJKDGJ','GJDFAJ']
    with open('filename.txt', 'wb') as F:       
        for s in syms[:-1]:                     # separate all but the last
            F.write(s + ',')                    # symbols with commas
        F.write(syms[-1])                       # end with the last symbol
    

    或者更简洁:

    with open('filename.txt', 'wb') as F:
        F.write(','.join(syms))
    

    此外,请检查不同的文件扩展名(即 .txt、.csv 等)以确保不是问题所在。如果这个程序在换行符上卡住了,那么一切皆有可能。

    【讨论】:

    • :-(。还是不行。然后我把第三方创建的txt,用作“嗅探器”文件。在上面的代码中运行它。还是不行……” b" 不起作用。该死的......完全失去了。
    • 好的,我们正在研究各种可能性。下一个想法:我注意到Works= 'PDCO,ICUI,DVA' 根本没有行终止符。当工作文件超过一行时会发生什么?创建一个工作的 2 行文件,并显示 goodf = open('file_that_works.txt', 'rb'); print repr(goodf.read(100)) 的输出
    • 想....既然 Works= 'PDCO,ICUI,DVA' 没有行终止符,如何创建一个没有行终止符的 txt 文件。第三方 Works= 'PDCO,ICUI,DVA' 文件也可能没有或不需要第二行。我的理由是第三方gui,1)询问或符号,2)然后单击保存按钮以创建txt文件。没有第二行。没什么对我说第三方文件格式正确。感谢您的帮助。
    • 你是说第三方app不能生成第二行?这是什么程序??也许它不能处理多行输入。那将是非常奇怪的;坦率地说,在那种情况下,我无法想象你为什么要费心使用 csv.writer 。只需喷出一堆用逗号分隔的符号。见上文。
    • 感谢编辑。编辑确实有效!但是给了我一些奇怪的符号组合......????在 Syms 上方查看我的编辑,给我 MHS、AIGMRK、AIG for MHS、AIGMRK、AIG。
    【解决方案4】:
    1. 所以,我保存为文本文件。

    2. 现在,用 python 创建我自己的 txt 文件。

    他们的文件与您的文件之间确切有何不同?准确。

    【讨论】:

    • @user428862:什么?文件之间的确切区别是什么?
    【解决方案5】:

    我怀疑@Hugh 的评论是正确的,这是一个编码问题。

    当您在记事本中执行另存为时,在“编码”下拉菜单中选择了什么?如果您选择不同的编码,是否部分或全部无法被 3rd 方程序打开?

    【讨论】:

    • 如果您选择不同的编码保存为记事本,它会停止工作吗?如果是这样,您的第 3 方程序不知道如何正确处理 CSV 编写器设置的编码(很可能是 UTF8 或其他形式的 unicode)。如果不使用非 ANSI 字符,则文本看起来与理解编码的程序相同,但即使文本相同并不意味着文件相同。
    • 阅读joelonsoftware.com/articles/Unicode.html 至少对字符编码的含义有一个基本的了解。文字不仅仅是文字。大多数现代程序应该理想地理解 unicode,但有些程序没有花时间正确支持它,而且您的 3rd 方应用程序似乎就是其中之一。 CSV 导出器可能有一个以 ANSI/ASCII 格式导出的设置,这应该可以解决您的问题,但实际上它是第 3 方程序,已被现代标准破坏。
    猜你喜欢
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2014-07-19
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多