Python无法读取包含特定字符串的文件

时间:2016-09-23 21:30:01

标签: python file python-3.x

我已经编写了一个函数来删除字符串的某些单词和字符。使用文件将有问题的字符串读入程序。该程序工作正常,除非文件在任何地方,在文件正文的任何​​位置包含以下内容。

  

安全启动安全更新(3177404)此安全更新   解决了Microsoft Windows中的漏洞。这个漏洞可以   如果是攻击者,则允许绕过安全启动安全功能   在目标设备上安装受影响的策略。攻击者必须拥有   管理权限或物理访问权限安装   策略并绕过安全启动。

我从来没有经历过这种奇怪的行为。有人有什么建议吗?

这是我写的功能。

def scrub(file_name):
    try:
        file = open(file_name,"r")
        unscrubbed_string = file.read()
        file.close()

        cms = open("common_misspellings.csv","r")
        for line in cms:
            replacement = line.strip('\n').split(',')
            while replacement[0] in unscrubbed_string:
                unscrubbed_string = unscrubbed_string.replace(replacement[0],replacement[1])

        cms.close()

        special_chars = ['.',',',';',"'","\""]

        for char in special_chars:
            while char in unscrubbed_string:
                unscrubbed_string = unscrubbed_string.replace(char,"")

        unscrubbed_list = unscrubbed_string.split()

        noise = open("noise.txt","r")
        noise_list = []

        for word in noise:
            noise_list.append(word.strip('\n'))

        noise.close()

        for noise in noise_list:
            while noise in unscrubbed_list:
                    unscrubbed_list.remove(noise)
        return unscrubbed_list

    except:
        print("""[*] File not found.""")

1 个答案:

答案 0 :(得分:1)

您的代码可能因为.replace()来电while循环而挂起。如果对于.csv文件的任何特定行,replacement[0]字符串是其相应replacement[1]子字符串,并且其中任何一个出现在您的关键字中文本,然后while循环永远不会完成。实际上,您根本不需要while循环 - 单个.replace()调用将替换所有匹配项。

但这只是你目前使用毯子unscrubbed_string.replace(...)的方法遇到的问题的一个例子。你需要使用正则表达式替换(来自re)模块,或者自己将字符串分解为单词并逐字逐句地工作。为什么?好吧,这是一个简单的例子:'Teh'需要更正为{​​{1}} - 但如果文档中包含对'The'的引用,该怎么办?你的"安全启动"文本将包含一个类似于此的示例。

如果你去正则表达式路线,符号'Tehran'通过匹配任何类型的词边界(字符串的开头或结尾,空格,标点符号)来解决这个问题。这是一个简单的例子:

\b

输出,强调错误:

  

Teh 伊朗的首都是德黑兰。 Teh 法国的首都是巴黎。 (import re replacements = { 'Teh':'The', } unscrubbed = 'Teh capital of Iran is Tehran. Teh capital of France is Paris.' better = unscrubbed naive = unscrubbed for target, replacement in replacements.items(): naive = naive.replace(target, replacement) pattern = r'\b' + target + r'\b' better = re.sub(pattern, replacement, better) print(unscrubbed) print(naive) print(better)

     

伊朗首都 Theran 。法国首都是巴黎。 (unscrubbed

     

伊朗首都是德黑兰。法国首都是巴黎。 (naive