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

时间:2013-06-12 02:33:01

标签: python csv file-io

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

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

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

 {subject: [7, 7], bias1Answer : [1, 0], itemID: [7, 2]} 
def load_data(filename):
    data = {}
    eprime = open(filename, 'r')
    for line in eprime:
        rows = re.sub('\s+', ' ', line).strip().split(':')
        try:
            data[rows[0]] += rows[1]
        except KeyError:
            data[rows[0]] = rows[1]
    eprime.close()
    return data
for line in open(fileName, 'r'):
    if ':' in line:
        row = line.strip().split(':')
        fullDict[row[0]] = row[1]
print fullDict

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

{'\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文件!!:

 Subject  itemID ... bias1Answer 
  7       7             1
  7       2             0

4 个答案:

答案 0 :(得分: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])

答案 1 :(得分: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 

答案 2 :(得分: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

答案 3 :(得分:0)

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

如果你这样做是因为你没有软件密钥,那么知道epold的 E-Merge E-DataAid 程序可能会有所帮助不需要钥匙。您只需要用于编辑构建文件的密钥。无论谁为您提供.txt文件,都应该有这些程序的安装盘。如果没有,它可以在PST网站上找到(我相信你需要一个序列码来创建一个帐户,但不确定)

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

以下是我将如何处理此问题:

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

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

  3. 打开合并文件。它可能看起来有点乱,取决于你在文件中有多少。您可以转到工具 - &gt;排列列。这将显示所有变量的列表。

  4. 调整以便只在右侧框中显示所需的变量。点击确定。

  5. 然后你应该有类似你最终目标的东西,可以作为csv导出。

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