将txt文件解析为字典并写入csv文件

7
Eprime输出一个.txt文件,格式如下:
*** Header Start *** VersionPersist: 1 LevelName: Session Subject: 7 Session: 1 RandomSeed: -1983293234 Group: 1 Display.RefreshRate: 59.654 *** Header End ***
Level: 2 *** LogFrame Start *** MeansEffectBias: 7 Procedure: trialProc itemID: 7 bias1Answer: 1 *** LogFrame End *** Level: 2 *** LogFrame Start *** MeansEffectBias: 2 Procedure: trialProc itemID: 2 bias1Answer: 0 *** LogFrame End ***
需要将此文本解析并写入.csv文件,但需删除一些行。
尝试创建一个字典,将冒号前出现的文本作为键,将其后的文本作为值:
{subject: [7, 7], bias1Answer : [1, 0], itemID: [7, 2]}
下面是一些脚本,但都产生了垃圾结果。
如果能设置好字典,就可以将其写入csv文件,格式如下:
Subject itemID ... bias1Answer 7 7 1 7 2 0
4个回答

5
您不需要创建字典。
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])

0

你的第二种方法是可行的,但每个字典键的值都应该是一个列表。目前,对于字典中的每个键,您仅存储一个值,因此只有最后一个值被存储。您可以修改代码,使每个键的值都是一个列表。

下面的代码将实现相同的效果:

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 

0

看起来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

0

我知道这是一个比较旧的问题,也许你早就解决了,但我认为你的方法比实际需要的要复杂。我觉得我可以回答一下,以防其他人遇到同样的问题。

如果你之所以这样做是因为没有软件密钥,那么你可能需要知道,E-MergeE-DataAid程序不需要密钥。你只需要在编辑构建文件时使用密钥。提供给你.txt文件的人可能应该有这些程序的安装光盘。如果没有,可以在PST网站上下载(我相信你需要一个序列号才能创建帐户,但不确定)。

Eprime通常会创建与你发布的文本文件内容匹配的.edat文件。但有时,如果Eprime崩溃了,你就只有.txt文件而没有edat文件。幸运的是,你可以从.txt文件生成edat文件。

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

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

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

  3. 打开合并后的文件。根据文件中包含的内容,它可能看起来有些混乱。您可以转到“工具->排列列”以显示所有变量的列表。

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

  5. 然后,您应该得到类似于最终目标的东西,可以导出为csv。

如果程序中有许多过程,此时您可能会有一些行只有启动信息和NULL,而您感兴趣的变量位置为空。您可以通过转到“工具->筛选器”并创建一个筛选器来消除这些行来解决此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接