将文本文件转换为字典列表

时间:2018-03-19 09:07:48

标签: python

我编写了一个脚本来将文本文件转换为字典..

script.py

l=[]
d={}
count=0

f=open('/home/asha/Desktop/test.txt','r')
for row in f:
    rowcount+=1
    if row[0] == ' ' in row:
        l.append(row)
    else:
        if count == 0:
            temp = row
            count+=1
        else:
            d[temp]=l
            l=[]
            count=0              
print d

TextFile.txt的

Time
 NtGetTickCount
 NtQueryPerformanceCounter
 NtQuerySystemTime
 NtQueryTimerResolution
 NtSetSystemTime
 NtSetTimerResolution
 RtlTimeFieldsToTime
 RtlTimeToTime
System informations
 NtQuerySystemInformation
 NtSetSystemInformation
 Enumerations
 Structures

我得到的输出是

{'Time\n': [' NtGetTickCount\n', ' NtQueryPerformanceCounter\n', ' NtQuerySystemTime\n', ' NtQueryTimerResolution\n', ' NtSetSystemTime\n', ' NtSetTimerResolution\n', ' RtlTimeFieldsToTime\n', ' RtlTimeToTime\n']}

能够在文本文件中最多转换为第9行。建议我在哪里出错......

6 个答案:

答案 0 :(得分:1)

您永远不会将最终列表提交(即运行d[row] = [])到字典中。

您可以在创建行时提交:

d = {}
cur = []

for row in f:
    if row[0] == ' ':  # line in section
        cur.append(row)
    else:  # new row
        d[row] = cur = []

print (d)

答案 1 :(得分:1)

使用dict.setdefault创建带有列表值的词典将使您的工作更轻松。

d = {}

with open('input.txt') as f:
    key = ''
    for row in f:
        if row.startswith(' '):
            d.setdefault(key, []).append(row.strip())
        else:
            key = row

print(d)

输出:

{'Time\n': ['NtGetTickCount', 'NtQueryPerformanceCounter', 'NtQuerySystemTime', 'NtQueryTimerResolution', 'NtSetSystemTime', 'NtSetTimerResolution', 'RtlTimeFieldsToTime', 'RtlTimeToTime'], 'System informations\n': ['NtQuerySystemInformation', 'NtSetSystemInformation', 'Enumerations', 'Structures']}

这里需要注意的一些事项:

  1. 始终使用with open(...)进行文件操作。
  2. 如果要检查第一个索引或前几个索引,请使用str.startswith()
  3. 使用collections.defaultdict

    可以做同样的事情
    from collections import defaultdict
    
    d = defaultdict(list)
    
    with open('input.txt') as f:
        key = ''
        for row in f:
            if row.startswith(' '):
                d[key].append(row)
            else:
                key = row
    

答案 2 :(得分:0)

因此,在循环文件时,您需要在任何给定时间知道两件事:

1)我们是在标题级别还是内容级别(通过缩进)和

2)目前的标题是什么

在下面的代码中,我们首先检查当前行是否为标题(因此它不以空格开头)并将func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let collectionViewWidth = collectionView.bounds.width let keys = Array(indoordataDictionary.keys) let keyString:String = keys[indexPath.section] let objFacilityUserList:FacilityUserList = indoordataDictionary[keyString]! as! FacilityUserList if objFacilityUserList.facilityUserList.count == 1 { return CGSize(width: collectionViewWidth, height: 30) } return CGSize(width: collectionViewWidth/2, height: 70) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { return 0 } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { return 5 } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { if indoorSegment.selectedSegmentIndex == 1 { return CGSize(width:collectionView.frame.size.width, height:0.0) } else { return CGSize(width:collectionView.frame.size.width, height:40.0) } } func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { let headerView: PlaceCollectionReusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: TagIDConstant.nibs.kPlaceCollectionReusableViewID, for: indexPath) as! PlaceCollectionReusableView let keys = Array(indoordataDictionary.keys) let keyString:String = keys[indexPath.section] headerView.placeNameLabel.text = keyString return headerView } 设置为该标题并将其插入到我们的字典中作为键和空列表作为值。

如果它不是标题,我们只需附加到相应的标题列表。

currentTitle

答案 3 :(得分:0)

试试这个:

d = {}
key = None

with open('/home/asha/Desktop/test.txt','r') as file:
    for line in file:
        if line.startswith(' '):
            d[key].append(line.strip())
        else:
            key = line.strip(); d[key] = []

print(d)

答案 4 :(得分:0)

只是为了加入我的2美分。

这个问题更容易倒退。考虑向后迭代文件,然后在到达标题时将值存储到字典中。

f=open('test.txt','r')

d = {}
l = []
for row in reversed(f.read().split('\n')):
    if row[0] == ' ': 
        l.append(row)
    else:
        d.update({row: l})
        l = []

答案 5 :(得分:0)

只需跟踪以''开头的行,您就完成了一个循环:

final=[]
keys=[]
flag=True
with open('new_text.txt','r') as f:
    data = []

    for line in f:
        if not line.startswith(' '):
            if line.strip():
                keys.append(line.strip())
            flag=False
            if data:
                final.append(data)
            data=[]
            flag=True
        else:
            if flag==True:
                data.append(line.strip())

final.append(data)
print(dict(zip(keys,final)))

输出:

{'Example': ['data1', 'data2'], 'Time': ['NtGetTickCount', 'NtQueryPerformanceCounter', 'NtQuerySystemTime', 'NtQueryTimerResolution', 'NtSetSystemTime', 'NtSetTimerResolution', 'RtlTimeFieldsToTime', 'RtlTimeToTime'], 'System informations': ['NtQuerySystemInformation', 'NtSetSystemInformation', 'Enumerations', 'Structures']}