使用re.match()从python中的csv文件搜索

时间:2018-07-13 14:27:28

标签: python-3.x csv search

我正在尝试在程序中放置一个模块,该模块能够在输入框中输入字符串,并在同一目录中的现有csv文件中进行搜索。之后,要查看是否已找到该字符串,应该打印找到还是找不到。当前显示错误:

  

TypeError:“类型”对象不可下标

from tkinter import *
from tkinter import ttk
import csv
import re
import os

win= Tk()
win.resizable(0, 0)
win.title('PRODUCT QUERY')

text_input=StringVar()
int_input1=IntVar()
int_input1.set('')
int_input2=IntVar()
int_input2.set('')


def update():
    import product_updater

def searcher():
    with open('products_database.csv', 'r') as x:
        global word
        word=str[int_input1]
        y=x.readlines()
        dbase_list=list(y)
        for i in word:
            if re.search(i, dbase_list):
                print('found')
            else:
                print('not found')

a=Label(win, text='Scan barcode').grid(column=0, row=0)
b=Entry(win, text=int_input1).grid(column=1, row=0)
c=Label(win, text='Item').grid(column=0, row=1)
d=Entry(win, text=text_input).grid(column=1, row=1)
e=Label(win, text='Sale price').grid(column=0, row=2)
f=Entry(win, text=int_input2).grid(column=1, row=2)
g=Button(win, text='Verify', command=searcher, width=20).grid(column=0, row=3, columnspan=1)
h=Button(win, text='Add product', command=update, width=20).grid(column=1, row=3)

win.mainloop()

1 个答案:

答案 0 :(得分:0)

如安德烈(Andre)所建议的那样,pandas是一个用于.csv操作的好库。

在这种情况下,要查找表中是否包含字符串,您可以执行以下操作:

import pandas as pd

def find_string_csv(file_name, to_find):
    my_csv = pd.read_csv(file_name)

    for col in my_csv:
        if my_csv[col].str.contains(to_find).any():
            print('found it')
            break
    else:
        print('not found')

.contains方法默认运行正则表达式匹配选项。此代码将遍历每列,并检查其中是否存在字符串。如果是这样,它将在第一次出现后中断并打印found it

请注意,它将与列的标题不匹配,因此,如果您有名为'abc'的列,并使用to_find == 'abc'运行此函数,它将找不到它。如果要在查询中包括列名,请在header=None参数中添加read_csv()

此外,如果您希望使用一个衬管,则可以将整个for / else循环替换为:

print('found it') if my_csv.isin([to_find]).any().any() else print('not found')

isin将返回一个新的pd.Dataframe,如果布尔值等于to_find,则布尔值为True,否则为False。在其上调用any将为您提供pd.Serie,其中每个条目将是一个布尔值,表示给定列的内部是否为True。如果任何列为True,则第二个any将为您提供布尔值True,否则为False。

我发现for循环更清晰,更易于阅读。