在文本文件中查找“字符串” - 使用Python添加到Excel文件
我运行了一个 grep
命令,发现一个大文件夹里有几百个相同的字符串。这个文件有2MB大,我想把里面的一些字符串提取出来,放到Excel文件里,以便以后方便查看。我想提取的部分是我需要后续处理的数据文件的路径。
最近我在学习Python,想着能不能自动完成这个提取的工作。但是我有点不知道从哪里开始。到目前为止,我写了这些代码:
data = open("C:\python27\text.txt").read()
if "string" in data:
不过接下来我不太确定该用什么方法从文件中提取我想要的内容。有没有适合初学者的建议呢?
编辑
这里有一些我想要的信息。我在一个文本文件里有几百行。每一行都有一个路径和一些字符串,像这样:
/path/to/file:STRING=SOME_STRING, ANOTHER_STRING
我想从这些行中提取出带有特定 "STRING=SOME_STRING" 的路径。例如,如果某一行是这样的,我想把路径 (/path/to/file
) 提取到另一个文件里:
/path/to/file:STRING=SOME_STRING
2 个回答
用标准的Python处理这些事情非常简单,但如果你想处理“excel”文件(比如xls或xlsx格式),就需要安装一个第三方库。不过,如果你只需要一个可以在电子表格中打开的二维表格,可以使用逗号分隔值(CSV)文件。这种文件格式与Excel和其他电子表格软件兼容,而且Python自带支持。
至于在文件中查找字符串,这也很简单。大多数情况下,你甚至不需要使用正则表达式。你想要查找字符串时,还需要什么其他信息吗?
另外,Python的“os”模块里有一些函数可以列出目录中的所有文件,或者整个目录树中的文件。最简单的用法是 os.listdir(path)。
字符串的方法,比如“count”和“find”,可以用来查找文件中的字符串,或者计算字符串出现的次数,除了使用“in”之外。
最后,“CSV”模块可以写出格式正确的文件,以便在任何电子表格中读取。
在这个过程中,你可以灵活使用Python内置的列表对象,方便地处理数据集。
下面是一个示例程序,它可以统计在命令行中给出的字符串,在指定目录的文件中查找,并将结果整理成一个CSV表格:
# -*- coding: utf-8 -*-
import csv
import sys, os
output_name = "count.csv"
def find_in_file(path, string_list):
count = []
file_ = open(path)
data = file_.read()
file_.close()
for string in string_list:
count.append(data.count(string))
return count
def main():
if len(sys.argv) < 3:
print "Use %s directory_path <string1>[ string2 [...]])\n" % __package__
sys.exit(1)
target_dir = sys.argv[1]
string_list = sys.argv[2:]
csv_file = open(output_name, "wt")
writer = csv.writer(csv_file)
header = ["Filename"] + string_list
writer.writerow(header)
for filename in os.listdir(target_dir):
path = os.path.join(target_dir, filename)
if not os.path.isfile(path):
continue
line = [filename] + find_in_file(path, string_list)
writer.writerow(line)
csv_file.close()
if __name__=="__main__":
main()
要完成这个任务,步骤如下:
- 先列出目录下的所有文件(如果你只关心一个文件,这一步可以省略)
- 找出你感兴趣的文件名
- 用循环逐行读取这些文件
- 检查每一行是否符合你的要求
- 提取每一行中第一个
:
字符之前的部分
所以,代码大概是这样的,前提是你的文本文件格式和你在问题中展示的一样,并且这个格式是可靠的:
import sys, os, glob
dir_path = sys.argv[1]
if dir_path[-1] != os.sep: dir_path+=os.sep
file_list = glob.glob(dir_path+'*.txt') #use standard *NIX wildcards to get your file names, in this case, all the files with a .txt extension
with open('out_file.csv', 'w') as out_file:
for filename in file_list:
with open(filename, 'r') as in_file:
for line in in_file:
if 'STRING=SOME_STRING' in line:
out_file.write(line.split(':')[0]+'\n')
这个程序可以通过命令python extract_paths.py path/to/directory
来运行,运行后会在你当前的目录下生成一个叫out_file.csv
的文件。
这个文件可以导入到Excel中作为CSV文件。如果你的输入数据不太可靠,使用正则表达式可能会更合适。