gpt4 book ai didi

python - 使用 python 3 中的换行符将字符串写入 CSV

转载 作者:行者123 更新时间:2023-12-01 01:34:37 31 4
gpt4 key购买 nike

使用 Python 3.7。

具体来说,我目前正在从 API(Qualys 的 API,获取报告)中提取数据。它返回一个字符串,其中包含 CSV 格式的所有报告数据,每个新行都指定有“\r\n”转义符。

(即'foo,bar,东西\r\n,更多东西,数据,报告\r\n,等等,等等\r\n')

我遇到的问题是将这个字符串正确写入 CSV 文件。当我在 Excel 中查看时,我尝试过的代码的每次迭代都会逐个单元格地写入数据,并将\r\n 附加到字符串中的所有位置,全部位于一行上,而不是新行上。

(即 |foo|bar|东西\r\n|更多东西|数据|报告\r\n|etc|etc|etc\r\n|)

我只是从 2 切换到 3,所以我几乎肯定这是一个语法错误,或者是我对 python 3 如何处理新行分隔符或类似内容的理解错误,但即使在查看文档之后,在这里和博客文章我要么无法理解它,要么我一直错过一些东西。

当前代码:

def dl_report(id, title):
data = {'action': 'fetch', 'id': id}
res = a.request('/api/2.0/fo/report/', data=data)
print(type(res)) #returns string

#input('pause')
f_csv = open(title,'w', newline='\r\n')
f_csv.write(res)
f_csv.close

但我也尝试过:

with open(title, 'w', newline='\r\n') as f:
writer = csv.writer(f,<tried encoding here, no luck>)
writer.writerows(res)

#anyone else looking at this, this didn't work because of the difference
#between writerow() and writerows()

我还尝试了各种方法来声明换行符,例如:

newline=''
newline='\n'
etc...

以及沿着这些思路的各种其他迭代。任何建议或指导或......在这一点上的任何事情都会很棒。

编辑:

好的,我继续努力,这有点有效:

def dl_report(id, title):
data = {'action': 'fetch', 'id': id}
res = a.request('/api/2.0/fo/report/', data=data)
print(type(res)) #returns string

reader = csv.reader(res.split(r'\r\n'), delimiter=',')

with open(title, 'w') as outfile:
writer = csv.writer(outfile, delimiter= '\n')
writer.writerow(reader)

但它很难看,并且确实会在输出 CSV 中产生错误(某些行(少于 1%)不会解析为 CSV 行,可能是某处的格式错误..),但更令人担忧的是它的工作方式不稳定当数据中出现“\”时。

我真的对一个更有效的解决方案感兴趣?更Python化?更加一致就好了...

有什么想法吗?

最佳答案

根据您的评论,为您提供的数据实际上并不包括回车符或换行符,它包括代表回车符和换行符的转义符的文本(因此它确实有一个数据中的反斜杠、r、反斜杠、n)。否则它已经是您想要的形式,因此您根本不需要涉及 csv 模块,只需将转义符解释为正确的值,然后直接写入数据即可。

使用 unicode-escape 编解码器(它也处理 ASCII 转义)相对简单:

import codecs  # Needed for text->text decoding

# ... retrieve data here, store to res ...

# Converts backslash followed by r to carriage return, by n to newline,
# and so on for other escapes
decoded = codecs.decode(res, 'unicode-escape')

# newline='' means don't perform line ending conversions, so you keep \r\n
# on all systems, no adding, no removing characters
# You may want to explicitly specify an encoding like UTF-8, rather than
# relying on the system default, so your code is portable across locales
with open(title, 'w', newline='') as f:
f.write(decoded)

如果您收到的字符串实际上用引号引起来(因此 print(repr(s)) 在两端都包含引号),则它们可能会被解释为 JSON 字符串。在这种情况下,只需将 importdecoded 创建替换为:

import json


decoded = json.loads(res)

关于python - 使用 python 3 中的换行符将字符串写入 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52505583/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com