如何去除字符串中的'\n'或正确将ByteIO转换为列表?
解决pycURL获取JSON数据时的转义字符与格式问题
我来帮你搞定这个问题!你的代码里有两个关键问题导致了多余的\n转义字符和不符合预期的JSON格式,咱们一步步拆解解决:
问题根源分析
- 多余的手动数组包裹:你在文件开头写了
[ \n、结尾写了\n],但实际上目标API返回的本身就是一个合法的JSON数组(比如[{"txid": "xxx", ...}, ...]),这会让最终的JSON变成[ "[...原API返回内容...]" ]——相当于把数组字符串又套了一层数组,完全破坏了结构。 - 错误的JSON写入方式:你把解码后的字符串直接用
json.dump()写入,这会把整个字符串当作JSON的一个字符串值,导致所有特殊字符(包括换行、双引号)都被自动转义,所以才会出现大量\n。
解决方案一:直接写入原始JSON字符串(无需修改数据时)
如果不需要对获取到的数据做任何修改,直接把API返回的JSON字符串写入文件即可,既不会产生转义,也不用手动处理数组结构:
import pycurl from io import BytesIO buffer = BytesIO() c = pycurl.Curl() c.setopt(c.URL, 'https://api.blockcypher.com/v1/eth/main/txs') c.setopt(c.WRITEDATA, buffer) c.perform() c.close() # 解码字节数据为字符串 body = buffer.getvalue().decode('UTF-8') # 直接写入文件,API返回的已经是合法JSON with open('data.json', 'w') as data_file: data_file.write(body)
解决方案二:解析为Python对象后写入(需要修改数据时)
如果需要对获取到的交易数据进行修改,先把JSON字符串解析成Python列表/字典,再用json.dump()写入,这样会自动处理格式,避免转义问题:
import pycurl import json from io import BytesIO buffer = BytesIO() c = pycurl.Curl() c.setopt(c.URL, 'https://api.blockcypher.com/v1/eth/main/txs') c.setopt(c.WRITEDATA, buffer) c.perform() c.close() # 解码并解析为Python对象 body = buffer.getvalue().decode('UTF-8') tx_list = json.loads(body) # 这里可以对tx_list做修改,比如过滤特定交易 # tx_list = [tx for tx in tx_list if tx['confirmations'] > 0] # 写入文件,indent参数可以让JSON更易读 with open('data.json', 'w') as data_file: json.dump(tx_list, data_file, indent=2, sort_keys=True, default=str)
为什么这两种方法能解决问题?
- 第一种方法直接复用API返回的合法JSON,跳过了Python的JSON序列化步骤,自然不会产生多余转义。
- 第二种方法先把JSON字符串解析成Python原生的列表对象,再用
json.dump()序列化,此时程序会按照JSON规范生成正确的格式,不会把原数据里的换行符当作需要转义的内容。
内容的提问来源于stack exchange,提问作者I'l Follio
相关产品推荐
相关产品推荐

