我从一位同事那里收到了这段代码,我打算用它来处理 100csv 文件以提取有关粒子的值。代码如下所示:
import sys
import csv
# Usage
# skdata_decode.py [input file 1] [input file 2] ...
# (It is possible to use filedcard to specify input files.)
#
# loop over files (sys.argv[0] is the name of the
if (len(sys.argv)<2):
print("Usage : ",sys.argv[0], "[input file 1] [input file 2]...")
exit()
# Process each file
for input_file_name in input_files:
with open(input_file_name, "r") as input_file:
print("Processing", input_file_name)
data = csv.reader(input_file)
if (len(sys.argv)<2):
print("Usage : ",sys.argv[0], "[input file 1] [input file 2]...")
exit()
for input_file_name in sys.argv[1:]:
with open(input_file_name,"r") as input_file:
print("Processing",input_file_name)
data = csv.reader(input_file)
pmt_id=[]
q=[]
t=[]
x=[]
y=[]
z=[]
vertex=[]
momentum=[]
mass_list=[]
pid_list=[]
momentum_list=[]
parent_list=[]
status_list=[]
nhits = 0
npart = 0
for row in data:
if (row[0]=='#E'):
if ('Run #' not in row[1]):
Run_no = row[1]
Event_no = row[2]
Trig_ID = row[3]
Year = row[4]
Month = row[5]
Day = row[6]
Hoour = row[7]
Minute = row[8]
Second = row[9]
if (row[0]=='#V'):
if ('x' not in row[1]):
vertex.append(row[1])
vertex.append(row[2])
vertex.append(row[3])
if (row[0]=='#P'):
if ('ID' not in row[1]):
index_part = row[1]
pid_list.append(row[2])
mass_list.append(row[3])
momentum.append(row[4])
momentum.append(row[5])
momentum.append(row[6])
momentum_list.append(momentum.copy())
momentum.clear()
parent_list.append(row[7])
status_list.append(row[8])
npart = npart + 1
if (('#' not in row[0])&(len(row)>1)):
pmt_id.append(int(row[0]))
q.append(float(row[1]))
t.append(float(row[2]))
x.append(float(row[3]))
y.append(float(row[4]))
z.append(float(row[5]))
当我在终端上运行“Python3 skdata_decode.py 1ring-e*.csv”时的输出是 'C:\Users\myuser> python3 skdata_decode.py 1ring-e*.csv Python'
如何修改此代码以确保我可以提取所有必要的值?
我认为问题出在 * 上,所以我尝试用“glob”重新格式化它,但事实并非如此。不要改变任何事情。我最初无法运行该脚本,因此我尝试创建一个 if 语句来退出,但这也不起作用。
的代码存在几个问题,导致它无法按预期工作。我将逐一解释这些问题,并为提供一个改进后的代码版本。
问题 1:无法访问文件名
尝试使用
sys.argv[1:]
访问文件名,但这只会给出原始传递给脚本的参数,而不是扩展的通配符模式。为了访问扩展的文件名,需要使用
glob
模块。
问题 2:冗余循环
的代码中有两个嵌套的
for
循环,用于迭代文件名,这会导致不必要的重复处理。只需要一个循环即可处理所有文件。
问题 3:条件语句中的错误
条件语句
if (len(sys.argv)<2):
在文件处理循环内。这会导致每次迭代都检查参数数量,这不是想要的。
改进后的代码
以下代码包含修复和改进,使其能够按预期工作:
import sys
import csv
import glob
# Usage
# skdata_decode.py "[input file pattern]"
# (Example: skdata_decode.py "1ring-e*.csv")
if (len(sys.argv) < 2):
print("Usage : ", sys.argv[0], "[input file pattern]")
exit()
input_file_pattern = sys.argv[1]
input_files = glob.glob(input_file_pattern)
# Process each file
for input_file_name in input_files:
with open(input_file_name, "r") as input_file:
print("Processing", input_file_name)
data = csv.reader(input_file)
pmt_id = []
q = []
t = []
x = []
y = []
z = []
vertex = []
momentum = []
mass_list = []
pid_list = []
momentum_list = []
parent_list = []
status_list = []
nhits = 0
npart = 0
for row in data:
if (row[0] == '#E'):
if ('Run #' not in row[1]):
Run_no = row[1]
Event_no = row[2]
Trig_ID = row[3]
Year = row[4]
Month = row[5]
Day = row[6]
Hoour = row[7]
Minute = row[8]
Second = row[9]
if (row[0] == '#V'):
if ('x' not in row[1]):
vertex.extend([row[1], row[2], row[3]])
if (row[0] == '#P'):
if ('ID' not in row[1]):
index_part = row[1]
pid_list.append(row[2])
mass_list.append(row[3])
momentum.extend([row[4], row[5], row[6]])
momentum_list.append(momentum.copy())
momentum.clear()
parent_list.append(row[7])
status_list.append(row[8])
npart += 1
if ('#' not in row[0]) and (len(row) > 1):
pmt_id.append(int(row[0]))
q.append(float(row[1]))
t.append(float(row[2]))
x.append(float(row[3]))
y.append(float(row[4]))
z.append(float(row[5]))
# 在这里,可以添加处理提取数据的代码
# 例如,打印提取的数据:
print("Vertex:", vertex)
print("Momentum List:", momentum_list)
# ...
运行代码
保存代码后,可以使用以下命令在命令提示符中运行它:
python skdata_decode.py "1ring-e*.csv"
这会将所有匹配 "1ring-e*.csv" 模式的文件传递给脚本进行处理。
希望这些解释和改进后的代码能够帮助解决问题!如果还有其他问题,请随时提问。
标签:python,shell,csv,if-statement,append From: 78814173