Python 返回与指定条件匹配的行,并编辑行中的特定列。然后将更改的行写入csv文件

Python 返回与指定条件匹配的行,并编辑行中的特定列。然后将更改的行写入csv文件,python,csv,Python,Csv,我正在编写一个python脚本,它可以处理两个csv文件。让我们把它们称为csv1.csv(要读取的原始文件)和csv2.csv(csv1的精确副本)。目标是在csv文件中找到与修改的用户定义输入相对应的行和列 csv格式:(持续约2-3000行) 假设用户正在寻找137TH_AV和NEWTON。我希望能够逐行比较两个列/行索引ST_LN和ZST_LN。如果两列都匹配用户输入的内容,那么我希望捕获csv文件中发生在上的行,并使用该信息编辑该行上剩余的列LIMIT1\u LNLIM LIMIT2\

我正在编写一个python脚本,它可以处理两个csv文件。让我们把它们称为csv1.csv(要读取的原始文件)和csv2.csv(csv1的精确副本)。目标是在csv文件中找到与修改的用户定义输入相对应的行和列

csv格式:(持续约2-3000行)

假设用户正在寻找137TH_AV和NEWTON。我希望能够逐行比较两个列/行索引ST_LN和ZST_LN。如果两列都匹配用户输入的内容,那么我希望捕获csv文件中发生在上的行,并使用该信息编辑该行上剩余的列LIMIT1\u LNLIM LIMIT2\u LNLIM LIMIT3\u LNLIM,并使用新的模拟值

我希望获得用户提供的3个新值,并编辑特定行和特定行元素。找到替换数字值的位置后,我想用此编辑覆盖csv2.csv

确定线段在阵列中的位置 每当我打印行索引时,它都会打印初始化值0

i = 0
row_index = 0

for i in range(len(st_lns)):
    if st_ln3 == st_lns[i] and zst_ln3 == zst_lns[i]:
        row_index = i

print(row_index)
limit1_input = limit1_lnlims[row_index]
limit2_input = limit2_lnlims[row_index]
limit3_input = limit3_lnlims[row_index]

csv_list = []
csv_list.append(record_lnlims)
csv_list.append(id_cos)
csv_list.append(id_dvs)
csv_list.append(id_lines)
csv_list.append(st_lns)
csv_list.append(zst_lns)
csv_list.append(id_lnlims)
csv_list.append(limit1_lnlims)
csv_list.append(limit2_lnlims)
csv_list.append(limit3_lnlims)

#Editing the csv file copy to implement new analog values
with open('lnlim_import_c.csv', 'w') as edit:
    for x in zip(csv_list):
        edit.write("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8}\t{9}\t{10}\n".format(x))

如果
print(row_index)
正在打印0,那么您的
如果st_ln3==st_lns[i]和zst_ln3==zst_lns[i]:
必须无法找到匹配项。你确定这就是你的意思吗?你是如何阅读第一个csv的?似乎这就是关键。我将继续发布整个脚本以供参考。如果
print(row\u index)
正在打印0,那么您的
如果st\u ln3==st\u lns[i]和zst\u ln3==zst\u lns[i]:
一定找不到匹配项。你确定这就是你的意思吗?你是如何阅读第一个csv的?看来这是关键我会继续发布整个脚本以供参考。
import sys
import csv
import os
import shutil

LineSectionNames = []
ScadaNames = []
with open('Vulcan_Imp_Summary.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        LineSectionName = row[1]
        ScadaName = row[29]
        LineSectionNames.append(LineSectionName)
        ScadaNames.append(ScadaName)

#Reformatting arrays for accurate references        
LineSectionNames = [character.replace('\xa0', ' ') for character in LineSectionNames]
LineSectionNames = [character.replace('?', '-') for character in LineSectionNames]
ScadaNames = [character.replace('\xa0', ' ') for character in ScadaNames]

#Setting Line Section name as key and Scada name as value
ScadaDict = {}
for i in range(len(LineSectionNames)):
    ScadaDict[LineSectionNames[i]] = ScadaNames[i]

#Prompt user for grammatical name of Line Section
print ('Enter the Line Section Name: (Example = Goulds-Princeton) \n')
user_input = input()

#Reference user input to dictionary value to convert input into SCADA format
def reformat():
    print ('Searching for Line Section...' + user_input)
    if user_input in ScadaDict:
        value = ScadaDict[user_input]
        print ('\n\t Match!\n')
    else:
       print ('The Line Section name you have entered was incorrect. Try again. \n Example = Goulds-Princeton')

reformat()

# Copying the exported file from Genesys
path = 'I://PSCO//DBGROUP//PatrickL//'
shutil.copyfile(path + 'lnlim_import.csv', path + 'lnlim_import_c.csv') 

#Using the SCADA format to search through csv file

print ('Searching csv file for...' + user_input)
# Reading the copied file
record_lnlims = []
id_cos = []
id_dvs = []
id_lines = []
id_lns = []
st_lns = []
zst_lns = []
id_lnlims = []
limit1_lnlims = []
limit2_lnlims = []
limit3_lnlims = []

with open('lnlim_import_c.csv', 'r') as copy: 
    reader = csv.reader(copy)
    for row in reader:
        record_lnlim = row[0]
        id_co = row[1]
        id_dv = row[2]
        id_line = row[3]
        id_ln = row[4]
        st_ln = row[5]
        zst_ln = row[6]
        id_lnlim = row[7]
        limit1_lnlim = row[8]
        limit2_lnlim = row[9]
        limit3_lnlim = row[10]
        record_lnlims.append(record_lnlim)
        id_cos.append(id_co)
        id_dvs.append(id_dv)
        id_lines.append(id_line)
        id_lns.append(id_ln)
        st_lns.append(st_ln)
        zst_lns.append(zst_ln)
        id_lnlims.append(id_lnlim)
        limit1_lnlims.append(limit1_lnlim)
        limit2_lnlims.append(limit2_lnlim)
        limit3_lnlims.append(limit3_lnlim)


#Reformatting the user input from GOULDS-PRINCETON to 'GOULDS' and 'PRINCETON'        
input_split = user_input.split('-', 1)
st_ln1 = input_split[0] 
zst_ln1 = input_split[1]
st_ln2 = st_ln1.upper()
zst_ln2 = zst_ln1.upper()
st_ln3 = "'" + str(st_ln2) + "'"
zst_ln3 = "'" + str(zst_ln2) + "'"

#Receiving analog values from user
print ('\n\t Found! \n')
print ('Enter the Specified Emergency Rating (A) for 110% for 7 minutes: ')
limit1_input = input()
print ('Enter the Specified Emergency Rating (A) for 120% for 7 minutes: ')
limit2_input = input()
print ('Enter the Specified Emergency Rating (A) for 130% for 5 minutes: ')
limit3_input = input()
i = 0
row_index = 0

for i in range(len(st_lns)):
    if st_ln3 == st_lns[i] and zst_ln3 == zst_lns[i]:
        row_index = i

print(row_index)
limit1_input = limit1_lnlims[row_index]
limit2_input = limit2_lnlims[row_index]
limit3_input = limit3_lnlims[row_index]

csv_list = []
csv_list.append(record_lnlims)
csv_list.append(id_cos)
csv_list.append(id_dvs)
csv_list.append(id_lines)
csv_list.append(st_lns)
csv_list.append(zst_lns)
csv_list.append(id_lnlims)
csv_list.append(limit1_lnlims)
csv_list.append(limit2_lnlims)
csv_list.append(limit3_lnlims)

#Editing the csv file copy to implement new analog values
with open('lnlim_import_c.csv', 'w') as edit:
    for x in zip(csv_list):
        edit.write("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8}\t{9}\t{10}\n".format(x))