要列出的文件内容,但不是字符串

2024-09-27 21:22:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将一个带有分词的嵌套列表从一个txt文件附加到一个新列表中。 我做的每件事,内容总是成为新列表中的一个字符串

是否可以按原样从文件中读取数据,并按嵌套列表的原样将其附加到列表中

这是我的密码:

dataFile = "library.txt"

with open(dataFile) as myfile:
    data="".join(line.rstrip() for line in myfile)
    data2=data.replace(" ","")

    newLibraryList = []

    newLibraryList.append(data2)

print(newLibraryList)

library.txt内容如下所示

[
    {"name": "brick"}, 
    {"dim": "0.108"},
    {"lamdbaValue": "0.610"},
    {"zValue": "5.000"},
    {"fireValue": "A"}
],
[
    {"name": "brick"},
    {"dim": "0.108"},
    {"lamdbaValue": "0.800"},
    {"zValue": "5.400"},
    {"fireValue": "A"}
]

如果有人能帮我或给我指出正确的方向,我真的很感激

Thx提前


Tags: nametxt内容列表datalinelibrarymyfile
1条回答
网友
1楼 · 发布于 2024-09-27 21:22:51

文件的某些部分类似于JSON—问题是:总共是无效的JSON

这是:

[
    {"name": "brick"}, 
    {"dim": "0.108"},
    {"lamdbaValue": "0.610"},
    {"zValue": "5.000"},
    {"fireValue": "A"}
]

对于包含5个字典(每个字典有1个键/值)的1元素列表,是有效的JSON

下面的代码使用字符串拆分和magic从发布的demodata创建“有效”部分,然后使用JSON.loads(string)从中创建python对象。它是脆弱的-如果你在你的文件中有任何错误,它会输出什么错误,并跳过它

它依赖于],上的拆分—如果您在数据部分中添加这些内容,它将中断,您必须修复它

创建演示文件(一个数据集已损坏-丢失}等):

fn = "library.txt"

with open(fn,"w") as f:
    f.write("""[
    {"name": "brick"}, 
    {"dim": "0.108"},
    {"lamdbaValue": "0.610"},
    {"zValue": "5.000"},
    {"fireValue": "A"}
],
[
    {"name": "brick",
    {"dim": "0.108"},
    {"lamdbaValue": "0.800"},
    {"zValue": "5.400",
    {"fireValue": "A"}
],
[
    {"name": "brick"},
    {"dim": "0.108"},
    {"lamdbaValue": "0.800"},
    {"zValue": "5.400"},
    {"fireValue": "A"}
]""")

解析:

import json

lib = []

with open(fn,"r") as r:
    text = r.read()
    spl = [t.rstrip("]").replace(" ","").replace("\n"," ")+"]" for t in text.split("],")]

    parts = []
    for p in spl:
        try:
            parts.append(json.loads(p))
        except  json.JSONDecodeError  as e:
            print("Skipping: ", p)
            print(e)

    # parts = [json.loads(p) for p in spl] # removed list comp for better 
    # exception text output/messages

    lib.extend(parts)

for l in lib:
    print(l) 

输出:

Skipping:   [ {"name":"brick", {"dim":"0.108"}, {"lamdbaValue":"0.800"}, {"zValue":"5.400", {"fireValue":"A"} ]
Expecting property name enclosed in double quotes: line 1 column 21 (char 20)


[{'name': 'brick'}, {'dim': '0.108'}, {'lamdbaValue': '0.610'}, 
 {'zValue': '5.000'}, {'fireValue': 'A'}]

[{'name': 'brick'}, {'dim': '0.108'}, {'lamdbaValue': '0.800'}, 
 {'zValue': '5.400'}, {'fireValue': 'A'}]

将您的数据转换为有效的json可能是值得的,这将大大简化:

fn = "library.txt"  # contains a list of dictionarys, each dict is one item

with open(fn,"w") as f:
    f.write("""[
    {"name": "brick", 
     "dim": "0.108",
     "lamdbaValue": "0.610",
     "zValue": "5.000",
     "fireValue": "A"}
,

    {"name": "brick",
     "dim": "0.108",
     "lamdbaValue": "0.800",
     "zValue": "5.400",
     "fireValue": "A"}
,   

    {"name": "brick",
     "dim": "0.108",
     "lamdbaValue": "0.800",
     "zValue": "5.400",
     "fireValue": "A"}
]""")

import json

lib = []

with open(fn,"r") as r:
    loaded_libs = json.load(r)

lib.extend(loaded_libs)

for l in lib:
    print(l) 

输出:

{'name': 'brick', 'dim': '0.108', 'lamdbaValue': '0.610', 
 'zValue': '5.000', 'fireValue': 'A'}
{'name': 'brick', 'dim': '0.108', 'lamdbaValue': '0.800', 
 'zValue': '5.400', 'fireValue': 'A'}
{'name': 'brick', 'dim': '0.108', 'lamdbaValue': '0.800', 
 'zValue': '5.400', 'fireValue': 'A'}

相关问题 更多 >

    热门问题