【问题标题】:csv.writer.writerow with a comma in a field not writing correctlycsv.writer.writerow 字段中的逗号未正确写入
【发布时间】:2021-02-04 20:34:07
【问题描述】:

我正在从网站中提取数据并将其保存为 Python 中的 CSV。大部分时间都有效,除非其中一行中的特定字段偶尔为数千并且供应商在该字段中包含逗号。无论我如何使用 writer.writerow(),我似乎都无法排除这个逗号被解释为分隔符,即使供应商在逗号出现时将特定字段括在双引号中。

# Obtain the data from the website
downloadresponse = s.post(downloadurl, data=downloaddata,headers=postheaders, cookies=loginresponse.cookies)
print("Download response status =", downloadresponse.status_code)
print("Downloading " +filename+" now.")

with open(filename, 'w') as f:
    writer = csv.writer(f, delimiter =',',escapechar='\\' ,quotechar ='"', quoting=csv.QUOTE_MINIMAL, doublequote=True)
    for line in downloadresponse.iter_lines():
        print("Raw Line =", line)
        print("UTF Line =", line.decode('utf-8'))
        print("UTF & Split Line =", line.decode('utf-8').split(','))
        writer.writerow(line.decode('utf-8').split(','))

为 CSV 中的有问题的行生成此输出。

Download response status = 200 
Download response reason = OK 
Downloading /Users/someone/Documents/@Investing/UOA-Workspace/data/uoa-eod-02-04-2021.csv now.

DEBUG-Raw Line = b'AMC,7.31,Call,2,02/05/21,1,5.25,5.33,5.4,5.3,739,283,2.61,"1,246.65%","15:10 ET"' \
DEBUG-UTF Line = AMC,7.31,Call,2,02/05/21,1,5.25,5.33,5.4,5.3,739,283,2.61,"1,246.65%","15:10 ET" \
DEBUG-UTF & Split Line = ['AMC', '7.31', 'Call', '2', '02/05/21', '1', '5.25', '5.33', '5.4', '5.3', '739', '283', '2.61', '"1', '246.65%"', '"15:10 ET"']

因此,原始 LINE 中的字段“1,246.65%”被逗号分割成两个字段“1”,“246.65%”,即使它包含在双引号中。谁能看到我做错了什么?

【问题讨论】:

  • str.split() 不关心引号。你为什么认为它应该这样做?
  • line 相对于引号看起来格式正确。为什么不直接写入字符串之类的文件,而不使用 csv 模块?
  • 当提出这样的问题时,您应该提供一个其他人可以运行的minimal reproducible example(而不是试图在您的代码中“看到”问题)。
  • @PranavHosangadi - 我没有看到任何其他方法可以将字段拆分为我的 CSV 中的单独列。
  • 我说“不使用 csv 模块”

标签: python csv export-to-csv


【解决方案1】:

正如cmets中提到的,你可以直接写,不用csv模块。行看起来正确引用。 类似的东西

with open(filename, 'w') as f:
    f.write(downloadresponse.text)

这可能需要一些调整。例如如果是流式响应,您可能需要逐行编写。

【讨论】:

    【解决方案2】:

    对于其他人,@buran 提供了答案。我以为我需要 csv.writer 但显然因为 API 响应已经格式化,我只需要将 response.text 写入文件并且它的格式非常完美。更新代码:

    # Obtain the data from the website
    downloadresponse = s.post(downloadurl, data=downloaddata,headers=postheaders, cookies=loginresponse.cookies)
    print("Download response status =", downloadresponse.status_code)
    print("Downloading " +filename+" now.")
    
    with open(filename, 'w') as f:
        f.write(downloadresponse.text)
        f.close()
    

    【讨论】:

    • 不需要f.close() - with 上下文管理器会为您关闭文件。
    猜你喜欢
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    相关资源
    最近更新 更多