मैं अपने कोड में बदलाव करना चाहता हूं ताकि मैं कई इनपुट फाइलों की खोज कर सकूं और कई इनपुट टाइप कर सकूं, मान लीजिए कि क्लाइंट ऑर्डर नंबर 7896547 मेरे द्वारा वहां रखी गई इनपुट फाइल में मौजूद है। एकाधिक फ़ाइलों के लिए एकाधिक खोज मानदंड लागू करने का सबसे अच्छा तरीका क्या है।

मेरा मतलब यह है कि 50 से अधिक इनपुट, 1234567, 1234568 आदि …… के बारे में बताएं, और कई फाइलों के माध्यम से भी खोजें (मेरा मतलब 10 से अधिक है)। इसे हासिल करने का सबसे कारगर तरीका क्या है?

मेरा कोड:

import csv

data=[]
with open("C:/Users/CSV/salesreport1.csv", "C:/Users/CSV//salesreport2.csv") as csvfile:
        reader = csv.reader(csvfile)
        for row in reader:
            data.append(row)
     
name = input("Enter a string: ")
col = [x[0] for x in data]

if name in col:
     for x in range(0, len(data)):
         if name == data[x] [0]:
          print(data[x])
          
else:
     print("Does not exist")

मैंने सोचा कि मैं केवल खुले () भाग में एक फ़ाइल नाम जोड़कर इनपुट जोड़ सकता हूं?

टाइप करते समय एकाधिक इनपुट जोड़ने के लिए, सरणी का उपयोग न करने का कोई तरीका है?

मेरा मतलब है पहचानकर्ता = ["x", "y", "z"], ऐसा नहीं करना

1
sang jiang 19 जुलाई 2021, 22:16

3 जवाब

सबसे बढ़िया उत्तर

बस स्पष्ट होने के लिए, आप कुछ .csvs में लोड कर रहे हैं, उपयोगकर्ता से एक नाम प्राप्त कर रहे हैं, और फिर उन पंक्तियों को प्रिंट कर रहे हैं जिनका नाम कॉलम 0 में है? यह पायथन डिक्शनरी के लिए एक अच्छा उपयोग केस जैसा लगता है, जो कि पायथन में एक सामान्य और सरल डेटा प्रकार है। यदि आप परिचित नहीं हैं, तो एक शब्दकोश आपको किसी कुंजी द्वारा जानकारी संग्रहीत करने देता है। उदाहरण के लिए, आपके पास एक कुंजी 'डैनियल' हो सकती है जो डैनियल नाम के किसी व्यक्ति के बारे में जानकारी की एक सूची संग्रहीत करती है। इस स्थिति में, आप सरणी के माध्यम से जा सकते हैं और प्रत्येक पंक्ति को कुंजी के रूप में नाम के साथ एक ताना में डाल सकते हैं। ऐसा दिखेगा:

names_dict = {}
for line in file:
    //split and get name
    name = split_line[0]
    names_dict[name] = line

और फिर तानाशाही में एक नाम देखने के लिए, आप बस यह करेंगे:

daniel_info = names_dict['Daniel']

या अधिक आम तौर पर,

info = names_dict[name]

आप अपने नामों की सूची प्राप्त करने और कोई नाम मौजूद है या नहीं, यह जांचने के लिए भी dict का उपयोग कर सकते हैं, क्योंकि पायथन डिक्ट्स में यह पता लगाने के लिए एक अंतर्निहित विधि है कि कोई कुंजी "इन" में मौजूद है या नहीं। आप बस कह सकते हैं:

if 'Daniel' in names_dict:

या फिर,

if name in names_dict:

इस परियोजना के साथ आप एक और अच्छी बात यह कर सकते हैं कि उपयोगकर्ता को यह चुनने दें कि वे कौन सा कॉलम खोज रहे हैं। उदाहरण के लिए, उन्हें कॉलम के लिए 3 डालने दें, और फिर उस पंक्ति, स्थान, ईमेल इत्यादि के कॉलम 3 में जो कुछ भी है उसे खोजें।

अंत में, मैं केवल एक पूर्ण ठोस उदाहरण दिखाऊंगा कि मैं क्या करूंगा:

import csv
##you could add to this list or get it from the user
files_to_open = ["C:/Users/CSV/salesreport1.csv","C:/Users/CSV//salesreport2.csv"]
data=[]

##iterate through list of files and add body to list
for file in files_to_open:
    csvfile = open(file,"r")
    reader = csv.reader(csvfile)
    for row in reader:
        data.append(row)
keys_dict = {}

column = int(input("Enter the column you want to search: "))
val = input("Enter the value you want to search for in this column: ")
for row in data:
    ##gets the thing in the right column
    v = row[column]
    ##adds the row to the list with the right key
    keys_dict[v] = row
if val in keys_dict:
    print(keys_dict[val])
else:
    print("Nothing was found at this column and key!")

संपादित करें: यहां बड़ी संख्या में टेक्स्ट फ़ाइलें लिखने और उन्हें एक फ़ाइल में संयोजित करने का एक तरीका है। एकाधिक इनपुट के लिए, आप उन्हें "डैनियल, सैम, माइक" जैसे अल्पविराम टाइप करने के लिए कह सकते हैं ... और फिर इन कॉमा पर आउटपुट को output.split(","). के साथ विभाजित कर सकते हैं:

for name in names:
    if name in names_dict:
        ##print them or say not found
0
Aaron 19 जुलाई 2021, 22:48

जैसा कि टिप्पणियों में उल्लेख किया गया है, आप CSV फ़ाइल को डेटाफ़्रेम के रूप में पढ़ सकते हैं और df.srt.find() का उपयोग किसी कॉलम में किसी मान की घटना की जांच करने के लिए कर सकते हैं।

import pandas as pd
df = pd.read_csv('file.csv')  # read CSV file as dataframe 
name = input("Enter a string: ")
result = df["column_name"].str.findall(name)  # The lowest index of its occurrence is returned.
1
Pouya Esmaeili 19 जुलाई 2021, 22:38

आप इस तरह open का उपयोग नहीं कर सकते।
दस्तावेज़ीकरण के अनुसार, आप प्रति कॉल केवल एक फ़ाइल पास कर सकते हैं .

यह देखते हुए कि आप बड़ी संख्या में फाइलों की जांच करना चाहते हैं, यहां एक बहुत ही सरल दृष्टिकोण का एक उदाहरण है जो इस स्क्रिप्ट के समान फ़ोल्डर में सभी सीएसवी की जांच करता है:

import csv
import os

data = []

# this gets all the filenames of files that end with .csv in the directory
csv_files = [x for x in os.listdir() if x.endswith('.csv')]

name = input("Enter a string: ")

# loops over every filename
for path in csv_files:
    # opens the file
    with open(path) as file:
        reader = csv.reader(file)
        for row in reader:
            # if the word is an exact match for an entry in a row
            if name in row:
                # prints the row
                print(row)

0
seck 19 जुलाई 2021, 22:39