【问题标题】:How to read a CSV File delimited by '\x01' and create a dictionary in python如何读取由 '\x01' 分隔的 CSV 文件并在 python 中创建字典
【发布时间】:2015-07-24 02:23:48
【问题描述】:

我需要读取一个以\x01 (^A) 分隔的 CSV 文件,并为我的查找创建一个字典以进一步处理我的业务逻辑。 我的输入文件包含许多列,我需要将 14 列作为键,其余作为值。

之前文件是逗号分隔的,我能够读取文件并创建字典。知道文件以\x01 分隔,我的脚本失败了

这就是我之前创建字典的方式

lake_dataset = csv.DictReader(open(local_registry_file_path+os.path.basename(registryPath),'rb'))
master_dir = {}
for row in lake_dataset:
    key = row.pop('TBL_DATASETLOCATION')
    key = key.lower().strip()
    master_dir[key] = row

【问题讨论】:

  • 这是我创建字典的代码,我得到数组越界错误 IndexError: list index out of range rawdata = open("/home/bgy/report/DATASET_2015-07-23. csv", "rb") 用于原始数据中的行:new_row = re.split('\^A', row) key = new_row[13] master_dir[key] = row

标签: python python-2.7 csv


【解决方案1】:

您可以尝试在 DictReader 中设置delimiter='\x01'

lake_dataset = csv.DictReader(open(local_registry_file_path+os.path.basename(registryPath),'rb'), delimiter='\x01')

【讨论】:

  • 我收到以下错误消息 Traceback(最近一次调用最后一次):文件“audit_report_test.py”,第 37 行,在 中,用于lake_dataset 中的行:文件“/usr/local/lib /python2.7/csv.py",第 108 行,在下一行 = self.reader.next() _csv.Error: line contains NULL byte
  • lake_dataset = csv.DictReader(open(local_registry_file_path +os.path.basename(registryPath),'rb'), delimiter='\x01') master_dir = {} for lake_dataset 中的行:key = row.pop('TBL_DATASETLOCATION') key = key.lower().strip() if("//") in (key): key1 = key.replace("//","/") key = key1 if key.endswith("/"): key0 = key key = key0[:-1] master_dir[key] = row
  • ia 能够摆脱错误消息,但无法拉出特定列并使其成为键。无法拆分列。
【解决方案2】:

您可以注册一个使用该字符作为分隔符的自定义方言as seen in this answer

import csv

class custom_sep(csv.excel):
    delimiter = chr(0x01)
csv.register_dialect("custom_sep", custom_sep)

data = """col1\x01col2\x01col3
foo\x01bar\x01baz
moo\x01mee\x01mah"""

data = csv.DictReader((x.strip() for x in data.split('\n')), dialect="custom_sep")
for row in data:
    print row

【讨论】:

  • 我确实注册了,但问题是我的文件没有被拆分,如果您查看我的代码,我需要拉出 TBL_DATASETLOCATION 列并将其设为键,其余列作为值。我无法分隔列。
  • 我添加了一个完整的示例。如果您的文件不起作用,则表示分隔符不是\x01
  • 嘿,我做了同样的事情,它成功了,谢谢你的帮助
  • 这里是我的代码 controlA = "\x01" master_dir = {} with open(local_registry_file_path +os.path.basename(registryPath),'rb') as lake_dataset: for line in lake_dataset: items = line.rstrip().split(controlA) #key = line.pop('TBL_DATASETLOCATION') key = items[13] key = key.lower().strip() if("//") in (key): key1 = key.replace("//","/") key = key1 if key.endswith("/"): key0 = key key = key0[:-1] master_dir[key] = line
  • 知道我可以拆分文件并创建字典,你能告诉我如何使用密钥引用第 n 列吗? master_dir[src_path][48] 这就是我试图通过传递密钥来获取第 49 列的值的方式,但我得到的是垃圾值。
猜你喜欢
  • 2013-03-02
  • 2015-10-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
相关资源
最近更新 更多