我有一个CSV文件,大约有700行和8列,但是最后一列有一个非常大的文本块(每个里面有足够的多个长段落)。我想通过python实现一个文本搜索函数,返回所有文本与第8列数据匹配的行(这意味着它需要遍历所有行)。什么可能是最快的方法来解决这个问题,并尽量减少搜索时间?
xytpbqjk1#
您可以将csv文件转储到sqlite数据库中,然后使用sqlite的full text search功能为您执行搜索。这个示例代码展示了如何完成它。有几件事需要注意:
import csv import sqlite3 import sys def create_table(conn, cols, name='mytable'): stmt = f"""CREATE VIRTUAL TABLE "{name}" USING fts5({cols})""" with conn: conn.execute(stmt) return def populate_table(conn, reader, cols, ncols, name='mytable'): placeholders = ', '.join(['?'] * ncols) stmt = f"""INSERT INTO "{name}" ({cols}) VALUES ({placeholders}) """ # Filter out any blank rows in the csv reader = filter(None, reader) with conn: conn.executemany(stmt, reader) return def search(conn, term, cols, name='mytable'): stmt = f"""SELECT {cols} FROM "{name}" WHERE "{name}" MATCH ? """ with conn: cursor = conn.cursor() cursor.execute(stmt, (term,)) result = cursor.fetchall() return result def main(path, term): result = 'NO RESULT SET' try: conn = sqlite3.connect(':memory:') with open(path, 'r') as f: reader = csv.reader(f) # Assume headers are in the first row headers = next(reader) ncols = len(headers) cols = ', '.join([f'"{x.strip()}"' for x in headers]) create_table(conn, cols) populate_table(conn, reader, cols, ncols) result = search(conn, term, cols) finally: conn.close() return result if __name__ == '__main__': print(main(*sys.argv[1:]))
1条答案
按热度按时间xytpbqjk1#
您可以将csv文件转储到sqlite数据库中,然后使用sqlite的full text search功能为您执行搜索。
这个示例代码展示了如何完成它。有几件事需要注意: