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

时间:2015-08-06 18:08:10

标签: python csv

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

csv格式:(继续约2-3万行)

record LNLIM, ID_CO,OD_DV,ID_LN, ST_LN, ZST_LN, ID_LNLIM,LIMIT1_LNLIM, LIMIT2_LNLIM, LIMIT3_LNLIM
LNLIM, 'FPL', 'SOUT', '137TH_LEVEE_B', 'B', '137TH_AV', 'LEVEE', 'A', 1000, 1100, 1200
LNLIM, 'FPL', 'SOUT', '137TH_DAVIS_B', 'A', '137TH_AV', 'NEWTON', 'A', 1000, 1100, 1200
...

让我们说用户正在寻找137TH_AV和NEWTON。我希望能够逐行进行并比较两列/行索引ST_LN和ZST_LN。如果两列都与用户输入的列匹配,那么我想捕获发生在csv文件中的哪一行,并使用该信息编辑该行的剩余列LIMIT1_LNLIM LIMIT2_LNLIM LIMIT3_LNLIM,并使用新的模拟值。

我想获取用户提供的3个新值,并编辑特定的行和特定的行元素。一旦我找到了替换数字值的地方,我想用这个编辑覆盖csv2.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()

每当我打印row_index时,它都会打印初始值为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))

0 个答案:

没有答案