如何使用Python进行文本索引和搜索?

1 投票
1 回答
864 浏览
提问于 2025-04-18 06:11

我想用Python从一个文件夹及其子文件夹中读取文本文件,并将它们保存到一个json文件中,格式是字典。我不确定读取的部分是否已经正确,但在搜索时总是收到错误信息。

这是我的索引代码

#!/usr/bin/python

import sys
import glob
import os
import json

basePath = str(sys.argv[1])
allfolder = []
filename = []
fh = []

for files in glob.glob( basePath + '/*.txt' ):
    filename.append(files)

for root, dirs, files in os.walk( basePath ):
    allfolder.append(dirs)

searchfolder = allfolder[0]

for folder in searchfolder:
    for files in glob.glob( basePath + '/' + folder + '/*.txt' ):
          filename.append(files)     

dic = open('index.json',"w")
info = {}

for i in filename:
    fobj = open(i,"r")
    for line in fobj:
        zeile = line.split(" ")
        for a in zeile:
            b = a.strip()
            if b == "":
                break
            dic.write(json.dumps({'wort' : b, 'pfad' : i}, indent=2))
    fobj.close()
dic.close()

这是我的搜索代码

#!/usr/bin/python

import sys
import os
import json

dictionary = 'index.json'
search = str(sys.argv[1])

if os.path.isfile(dictionary) == False:
    print('Die Datei wurde nicht gefunden')

json_data=open(dictionary)

data = json.load(json_data)
pprint(data)
json_data.close()

现在出现的错误信息是

christoph@Notebook-CSWS:~/System/Blatt4$ python3 sucher.py a
Traceback (most recent call last):
  File "sucher.py", line 15, in <module>
    data = json.load(json_data)
  File "/usr/lib/python3.3/json/__init__.py", line 274, in load
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
  File "/usr/lib/python3.3/json/__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.3/json/decoder.py", line 355, in decode
    raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 4 column 2 - line 54490 column 2 (char 87 - 1833872)

有没有人能帮我解决这个问题?
提前谢谢你们!

1 个回答

0

问题在于,你创建的 JSON 文件是有问题的。

如果你使用一个工具,比如 jsonlint,来检查你的 "index.json" 文件,你会发现这个 JSON 文件格式上存在问题。

你的代码在生成 JSON 文件时,是在一个循环里使用 dic.write,这样做是把 JSON 字符串的一部分一部分地添加上去,虽然每一部分可能都是有效的,但它们并没有正确地连接在一起。

解决方法有:

一次性写入完整的 JSON 文件

如果可以的话,先在内存中(可能以字典的形式)创建完整的字典内容,等到内容准备好后,再一次性把它写入 JSON 文件。

撰写回答