python-3.x - 将列表转换为字典,并标记键值 - 可能吗?
问题描述
所以基本上我有一个我正在打开并读入python的文件文件夹。
我想搜索这些文件并计算每个文件中的关键字,以制作一个像附件图像一样的数据框。
编辑1:
我决定尝试将文件作为字典导入。它有效,但是当我尝试将值小写时,我得到一个“列表”对象属性错误——即使在我的变量资源管理器中,它被定义为字典。
import os
filenames = os.listdir('.')
file_dict = {}
for file in filenames:
with open(file) as f:
items = [i.strip() for i in f.read().split(",")]
file_dict[file.replace(".txt", "")] = items
def lower_dict(d):
new_dict = dict((k, v.lower()) for k, v in d.items())
return new_dict
print(lower_dict(file_dict))
输出 =
AttributeError: 'list' 对象没有属性 'lower'
预编辑帖子:
1.每个列表值不保留文件名键。所以我没有我需要的行。
2.无论如何我无法在列表中搜索关键字,因为它没有被标记化。所以我无法计算每个文件的关键字。
这是我打开文件、将它们转换为小写并将它们存储在列表中的代码。
如何将其转换为保留文件名和标记化键值的字典?. 此外,以某种方式直接将文件和内容导入字典会更好吗?我还能将所有内容标记化和小写吗?
import os
import nltk
# create list of filenames to loop over
filenames = os.listdir('.')
#create an empty list for storage
Lcase_content = []
tokenized = []
num = 0
# read files from folder, convert to lower case
for filename in filenames:
if filename.endswith(".txt"):
with open(os.path.join('.', filename)) as file:
content = file.read()
# convert to lower-case value
Lcase_content.append(content.lower())
## this two lines below don't work - index out of range error
tokenized[num] = nltk.tokenize.word_tokenize(tokenized[num])
num = num + 1
解决方案
您可以使用 Collections 计算每个令牌的计数。collections.Counter
可以获取一个字符串列表并返回一个类似字典的计数器,其中每个标记在其键中,并且在值中标记的计数。由于 NLTKworkd_tokenize
采用一系列字符串并返回一个列表,因此要获取带有标记及其计数的字典,您基本上可以这样做:
Counter(nltk.tokenize.word_tokenize())
由于您希望文件名作为索引(第一列),因此将其作为嵌套字典,以文件名作为键,另一个字典以标记和计数作为值,如下所示:
{'file1.txt': Counter({'cat': 4, 'dog': 0, 'squirrel': 12, 'sea horse': 3}), 'file2.txt': Counter({'cat': 11,“狗”:4,“松鼠”:17,“海马”:0})}
如果您熟悉 Pandas,则可以将字典转换为 Pandas 数据框。通过将 Pandas 数据框结果导出为 csv 文件,您可以更轻松地使用任何 tsv/csv/excel 文件。确保您适用.lower()
于您的文件内容并包含orient='index'
,以便文件名成为您的索引。
import os
import nltk
from collections import Counter
import pandas as pd
result = dict()
filenames = os.listdir('.')
for filename in filenames:
if filename.endswith(".txt"):
with open(os.path.join('.', filename)) as file:
content = file.read().lower()
result[filename] = Counter(nltk.tokenize.word_tokenize(content))
df = pd.DataFrame.from_dict(result, orient='index').fillna(0)
df['total words'] = df.sum(axis=1)
df.to_csv('words_count.csv', index=True)
回复:您的第一次尝试,因为您的“项目”是一个列表(请参阅[i.strip() for i in f.read().split(",")]
),您不能申请.lower()
它。
回复:您的第二次尝试,您的“标记化”是空的,因为它被初始化为tokenized = []
. 这就是为什么当您尝试这样做时tokenized[num] = nltk.tokenize.word_tokenize(tokenized[num])
,tokenized[num]
使用 num = 0 会给您索引超出范围错误。
推荐阅读
- angular - 当我点击一个按钮时,Angular 我得到错误表达式在检查后发生了变化
- loops - 是否可以从外部函数中停止代码/goroutine?
- javascript - 如何获得多个数组值的余数?
- c++ - 在 C++ 向量中获取空格分隔的整数输入和一个整数输入
- authentication - 常见 OAUTH2 提供者的动态参数
- graphql - 未知类型查询 (GraphQL)
- javascript - div内部HTML上的querySelector,getElementById不起作用
- javascript - 如何从具有嵌套对象的数组中获取新数组?
- amazon-web-services - 如果存储桶名称不包含 sagemaker,则需要哪些权限才能允许 Lambda 函数创建 SageMaker 批量转换作业?
- node.js - node js express会话如何在浏览器打开之前保持所有路径和页面重新加载相同