【问题标题】:Parsing a txt file into a dictionary to write to csv file将 txt 文件解析为字典以写入 csv 文件
【发布时间】:2013-06-08 01:16:20
【问题描述】:

Eprime 输出一个 .txt 文件,如下所示:

*** 标题开始 ***
版本持续:1
级别名称:会话
主题:7
会话:1
随机种子:-1983293234
组:1
显示刷新率:59.654
*** 标题结束 ***
    等级:2
    *** LogFrame 开始 ***
    均值效应偏差:7
    程序:trialProc
    物品编号:7
    偏见1答案:1
    *** LogFrame 结束 ***
    等级:2
    *** LogFrame 开始 ***
    均值效应偏差:2
    程序:trialProc
    物品编号:2
    偏见1答案:0

我想解析这个并将其写入一个 .csv 文件,但删除了许多行。

我试图创建一个字典,将出现在冒号之前的文本作为键, 后面的文本作为值:

 {subject: [7, 7], bias1Answer : [1, 0], itemID: [7, 2]} 
def load_data(文件名): 数据 = {} eprime = 打开(文件名,'r') 对于 eprim 中的行: rows = re.sub('\s+', ' ', line).strip().split(':') 尝试: 数据[行[0]] += 行[1] 除了 KeyError: 数据[行[0]] = 行[1] eprime.close() 返回数据 对于打开的行(文件名,'r'): 如果':'在行: 行 = line.strip().split(':') fullDict[行[0]] = 行[1] 打印完整字典

以下两个脚本都会产生垃圾:

{'\x00\t\x00M\x00e\x00a\x00n\x00s\x00E\x00f\x00f\x00e\x00c\x00t\x00B\x00i\x00a\x00s\x00': '\x00\x005\x00\r\ x00', '\x00\t\x00B\x00i\x00a\x00s\x002\x00Q\x00.\x00D\x00u\x00r\x00a\x00t\x00i\x00o\x00n\x00E\x00r\x00r\x00o\x00r\ x00': '\x00\x00-\x009\x009\x009\x009\x009\x009\x00\r\x00'

如果我可以设置字典,我可以将它写入一个如下所示的 csv 文件!:

 主题 itemID ... bias1Answer
  7 7 1
  7 2 0

【问题讨论】:

    标签: python csv file-io


    【解决方案1】:

    您不需要创建字典。

    import codecs
    import csv
    
    with codecs.open('eprime.txt', encoding='utf-16') as f, open('output.csv', 'w') as fout:
        writer = csv.writer(fout, delimiter='\t')
        writer.writerow(['Subject', 'itemID', 'bias1Answer'])
        for line in f:
            if ':' in line:
                value = line.split()[-1]
    
            if 'Subject:' in line:
                subject = value
            elif 'itemID:' in line:
                itemID = value
            elif 'bias1Answer:' in line:
                bias1Answer = value
                writer.writerow([subject, itemID, bias1Answer])
    

    【讨论】:

      【解决方案2】:

      您的第二种方法可行,但每个字典键的值应该是一个列表。目前,对于字典中的每个键,您只存储一个值,因此只存储最后一个值。您可以修改代码,使每个键的值都是一个列表。 下面的代码将达到相同的效果:

      for line in open(fileName, 'r'):
          if ':' in line:
              row = line.strip().split(':')
              # Use row[0] as a key, initiate its value
              # to be a list and add row[1] to the list. 
              # In case already a key 'row[0]'
              # exists append row[1] to the existing value list
              fullDict.setdefault(row[0],[]).append(row[1])
      print fullDict 
      

      【讨论】:

        【解决方案3】:

        Eprime 的输出似乎是用 utf-16 编码的..

        >>> print '\x00\t\x00M\x00e\x00a\x00n\x00s\x00E\x00f\x00f\x00e\x00c\x00t\x00B\x00i\x00a\x00s\x00'.decode('utf-16-be')
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
          File "/usr/lib/python2.7/encodings/utf_16_be.py", line 16, in decode
            return codecs.utf_16_be_decode(input, errors, True)
        UnicodeDecodeError: 'utf16' codec can't decode byte 0x00 in position 32: truncated data
        >>> print '\x00\t\x00M\x00e\x00a\x00n\x00s\x00E\x00f\x00f\x00e\x00c\x00t\x00B\x00i\x00a\x00s\x00'.decode('utf-16-be', 'ignore')
            MeansEffectBias
        

        【讨论】:

          【解决方案4】:

          我知道这是一个较老的问题,所以也许你早就解决了,但我认为你正在以一种比需要的更复杂的方式来解决这个问题。我想我会做出回应,以防其他人遇到同样的问题并发现这个问题。

          如果您这样做是因为您没有软件密钥,那么了解 eprime 的 E-MergeE-DataAid 程序可能会有所帮助不需要钥匙。您只需要编辑构建文件的密钥。向您提供 .txt 文件的人可能应该有这些程序的安装盘。如果没有,可以在PST网站上找到(我相信你需要一个序列号来创建一个帐户,但不确定)

          Eprime 通常会创建一个.edat 文件,该文件与您发布示例的文本文件的内容相匹配。有时,如果 eprime 崩溃,您不会获得 edat 文件,而只有 .txt。幸运的是,您可以从 .txt 文件生成 edat 文件。

          以下是我处理此问题的方法:

          1. 如果您没有可用的 edat 文件,请先使用 E-DataAid 来恢复文件。

          2. 然后假设您有多个参与者,您可以使用 E-Merge 将完成此任务的所有参与者的所有 edat 文件合并在一起。

          3. 打开合并的文件。根据您在文件中的数量,它可能看起来有点混乱。您可以转到工具->排列列。这将显示所有变量的列表。

          4. 进行调整,使右侧框中只有所需的变量。点击确定。

          5. 那么你应该有一些类似于你的最终目标的东西,可以导出为 csv。

          如果您的程序中有许多过程,此时您可能会在您的变量或兴趣所在的位置有仅包含启动信息和NULL 的行。您可以通过转到 tools->filter 并创建一个过滤器来消除这些行来解决此问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-29
            • 2023-03-03
            • 1970-01-01
            • 2016-08-16
            • 2018-11-07
            • 2019-11-13
            • 1970-01-01
            相关资源
            最近更新 更多