我正在尝试在程序中放置一个模块,该模块能够在输入框中输入字符串,并在同一目录中的现有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()
答案 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循环更清晰,更易于阅读。