首页 > 解决方案 > 在代码中定义列表与从文件中读取列表

问题描述

我正在尝试计算给定报告中特定单词的数量。有谁知道为什么在代码中定义一个列表会使以下代码的第二部分比从文件中读取列表运行得更快?有解决办法吗?包含相同单词的列表比以下示例中的两个单词长得多。

# Example code: Within code list
import csv
import glob
import re
import time

TARGET_FILES = r'C:/Users/s170760/Desktop/Reports_Cleaned/*.*'

OUTPUT_FILE = r'C:/Users/s170760/Desktop/Parser.csv'

OUTPUT_FIELDS = ['file name', 'create']

create = {'agile', 'skills'}

def main():

    f_out = open(OUTPUT_FILE, 'w')
    wr = csv.writer(f_out, lineterminator='\n')
    wr.writerow(OUTPUT_FIELDS)

    file_list = glob.glob(TARGET_FILES)
    for file in file_list:
        print(file)
        with open(file, 'r', encoding='UTF-8', errors='ignore') as f_in:
            doc = f_in.read()
        doc = doc.lower()
        output_data = get_data(doc)
        output_data[0] = file
        wr.writerow(output_data)

def get_data(doc):
    _odata = [0] * 2
    
    tokens = re.findall('\w(?:[-\w]*\w)?', doc)
    for token in tokens:
        if token in create:
            _odata[1] += 1
    return _odata

这是另一种方式:

# Example code: Reading list from a file
import csv
import glob
import re
import time

TARGET_FILES = r'C:/Users/s170760/Desktop/Reports_Cleaned/*.*'

OUTPUT_FILE = r'C:/Users/s170760/Desktop/Parser.csv'

OUTPUT_FIELDS = ['file name', 'create']

create = open('C:/Users/s170760/Desktop/Create.txt', 'r').read().splitlines()

def main():

    f_out = open(OUTPUT_FILE, 'w')
    wr = csv.writer(f_out, lineterminator='\n')
    wr.writerow(OUTPUT_FIELDS)

    file_list = glob.glob(TARGET_FILES)
    for file in file_list:
        print(file)
        with open(file, 'r', encoding='UTF-8', errors='ignore') as f_in:
            doc = f_in.read()
        doc = doc.lower()
        output_data = get_data(doc)
        output_data[0] = file
        wr.writerow(output_data)

def get_data(doc):
    _odata = [0] * 2
    
    tokens = re.findall('\w(?:[-\w]*\w)?', doc)
    for token in tokens:
        if token in create:
            _odata[1] += 1
    return _odata

标签: python

解决方案


正如 Mark 在评论中指出的那样,第一个代码片段使用 a setof 字符串,而第二个代码片段将文件加载到 a listof 字符串中。

为什么在这个用例中集合比列表快,在这个Stack Overflow 答案中有很好的解释。将输出解析open为 aset确实可以解决您的问题。

所以替换:

create = open('C:/Users/s170760/Desktop/Create.txt', 'r').read().splitlines()

和:

create = set(open('C:/Users/s170760/Desktop/Create.txt', 'r').read().splitlines())

推荐阅读