【问题标题】:trying to create a dictionary from a text file试图从文本文件创建字典
【发布时间】:2012-10-31 03:49:38
【问题描述】:

fieldict(filename) 读取 DOT 格式的文件并 返回带有 DOT CMPLID 的字典,转换为 整数,作为键,一个元组作为对应的值 为那把钥匙。元组的格式是: (制造商、日期、事故、城市、州)

fieldict("DOT500.txt")[416]
  ('DAIMLERCHRYSLER  CORPORATION', datetime.date(1995, 1, 9), False, 'ARCADIA', 

到目前为止,我已经尝试过

from collections import defaultdict
import datetime

def fieldict(filename):
    with open(filename) as f:
        x=[line.split('\t')[0].strip() for line in f] #list of complaint numbers
        y= line.split('\t') #list of full complaints
        d={}
        for j in x:
            Y= True
            N= False
            d[j] = tuple(y[2],datetime.date(y[7]), y[6], y[12], y[13])   #dict with number of complaint as key and tuple with index as values
        return d

不走运...我想我很接近了..非常感谢任何帮助

编辑:每个投诉的格式如下

'11\t958128\tDAIMLERCHRYSLER CORPORATION\tDODGE\tSHADOW\t1990\tY\t19941117\tN\t0\t0\tENGINE AND ENGINE COOLING:ENGINE\tWILMINGTON  \tDE\t1B3XT44KXLN\t19950103\t19950103\t\t1\tENGINE MOTOR MOUNTS FAILED, RESULTING IN ENGINE NOISE. *AK\tEVOQ\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tV\t\r\n'

不显示字符标记的条目:

11  958128  DAIMLERCHRYSLER CORPORATION DODGE   SHADOW  1990    Y   19941117    N   0   0   ENGINE AND ENGINE COOLING:ENGINE    WILMINGTON      DE  1B3XT44KXLN 19950103    19950103        1   ENGINE MOTOR MOUNTS FAILED, RESULTING IN ENGINE NOISE.  *AK EVOQ    

【问题讨论】:

  • 你能举一个文件内容的例子吗?
  • 交通部的档案中有 500 份投诉......每份的格式如下:
  • 为什么不只显示两行? (您可以将它们编辑到问题中)
  • 以上是文件中的第11条
  • 前几天其他人也在研究这个问题并获得了一些可能对您也有用的帮助——请参阅herehere

标签: python dictionary list-comprehension


【解决方案1】:

看起来您想与csv 模块交朋友,因为它看起来像制表符格式的 csv 文本。 csv.reader() 有一个 .next() 方法,当您将其放入 for 循环时会调用该方法,因此您可以逐行浏览文件。

作为一般提示,请阅读 PEP8,并使用易于理解的变量名。 使用 python,如果它开始感觉很难,这是一个好兆头,通常有更好的方法。

import csv
import datetime

def _build_datetime(line)
    year_idx = x
    month_idx = y
    day_idx = z
    indexes = (year_idx, month_idx, day_idx)

    result_datetime = None
    if all(line[idx] for idx in indexes): # check that expected values are populated
        int_values = [int(line[idx]) for idx in indexes]
        result_datetime = datetime.date(*int_values)
    return result_datetime

def format2dict(filename):
    complaints = {}
    with open(filename, "rb") as in_f:
        reader = csv.reader(in_f, delimiter='\t')
        complaint_id_idx = 0
        manufacturer_idx = 2
        crash_idx = x
        city_idx = 12
        state_idx = 13

        for line in reader:
            complaint_id = int(line[complaint_id_idx])
            data= (
                         line[manufacturer_idx], 
                         _build_datetime(line),
                         line[crash_idx],
                         line[city_idx],
                         line[state_idx],
                        )

            complaints[complaint_id] = data
    return complaints


if __name__ == "__main__":
    formatted_data = format2dict("DOT500.txt")

【讨论】:

    【解决方案2】:

    注意:修剪换行符由读者决定。

    一个干净的方法是使用dict(zip(headers,data_list))

    假设您的示例数据看起来像

    joe\tSan Francisco\tapple
    frank\tNew York City\torange
    tim\tHawaii\tpineapple
    

    你可以这样做:

    results = []
    headers = ['person','place','fruit']
    
    for line in open('datafile.txt').readlines():
        record = line.split('\t')
        results.append(dict(zip(headers,record)))
    

    这将为每一行创建一个字典并将其附加到“结果”的末尾。

    看起来像:

    [{'fruit': 'apple\n', 'person': 'joe', 'place': 'San Francisco'},
     {'fruit': 'orange\n', 'person': 'frank', 'place': 'New York City'},
     {'fruit': 'pineapple\n', 'person': 'tim', 'place': 'Hawaii'}]
    

    【讨论】:

      【解决方案3】:

      使用 line.split('\t') 将文本分解成片段,您走在正确的轨道上。尝试这样的方法从分割的部分构建元组。

      import datetime
      
      a = '11\t958128\tDAIMLERCHRYSLER CORPORATION\tDODGE\tSHADOW\t1990\tY\t19941117\tN\t0\t0\tENGINE AND ENGINE COOLING:ENGINE\tWILMINGTON  \tDE\t1B3XT44KXLN\t19950103\t19950103\t\t1\tENGINE MOTOR MOUNTS FAILED, RESULTING IN ENGINE NOISE. *AK\tEVOQ\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tV\t'
      
      fields = a.split('\t')
      recordNum = fields[0]
      mfr = fields[2]
      recDate = datetime.date(int(fields[5]),1,2)
      make = fields[4]
      DOTrecord = recordNum,mfr, recDate,make
      print DOTrecord
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-10
        • 1970-01-01
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 2012-03-08
        • 1970-01-01
        相关资源
        最近更新 更多