首页 > 编程问答 >Python - 旨在通过命令提示符执行数据清理,但代码似乎无法运行

Python - 旨在通过命令提示符执行数据清理,但代码似乎无法运行

时间:2024-07-31 10:02:23浏览次数:9  
标签:python shell csv if-statement append

我从一位同事那里收到了这段代码,我打算用它来处理 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

相关文章

  • 如何在 python 终端中的 x,y 位置上书写(基于文本)
    我想在python(基于文本)的终端中的定义位置(x,y)上写入字符。假设,我有一个大小为25x80的终端,并且想要在位置(2,20)上写入字符。我可以在Python中执行此操作吗?现在,我使用25x80数组,并写入该数组。为了在屏幕上显示,我清除屏幕并将该数组的全部内容写入屏幕,但这效......
  • Python - Composition
     classEngine:def__init__(self,power):self.power=powerdefstart(self):self.draw_current()self.spin()self.ignite()defdraw_current(self):print('Drawingcurrent')defspin(sel......
  • Python - Iterator vs Iterable
    Therearemanybuilt-infunctionsandmethodsthatreturniterablesanditerators.Hereareafewexamples:range()returnsaniterabledict.keys()returnsaniterabledict.items()returnsaniterabledict.values()returnsaniterableenumerate()returns......
  • 在python中使用变量引用Panda列名称
    我正在尝试编写一个函数来简化我的代码,因此我传递了包含列名称的变量。它适用于Django应用程序,调试器不会对我的错误所在提供任何反馈,只是“内部服务器错误”。我的代码工作正常,不是作为函数编写的:df_trips['trip_time_prep_starts']=df_trips["trip_time_prep_sta......
  • 使用finallshell连接linux
    用户可以去FinalShell的官网上下载,只需点击下载地址,即可轻松下载安装包。傻瓜式安装点击到底。使用双击打开页面,新建连接右击连接,新建》ssh 连接,双击新建的连接,如下界面即连接成功。新建文件夹,右键新建文件夹。新建文件,在文件夹右键新建文件。命令在命令区域正......
  • 如何在 Pyqt5 Python 中实现 QTableWidget 列过滤器中的搜索栏?
    我使用pyqt5创建了一个QTableWidget,并成功地在表格小部件的每一列中添加了过滤选项,并使用堆栈溢出上可用的答案之一。过滤器按预期工作,但我想在顶部的过滤器中添加搜索栏来搜索值。在我的python脚本中,过滤器中可能有大约50多个唯一值。因此,如果有一种方法可以在过滤器......
  • Python - Abstract Base classes
    Wehaveseenthatifwehavetodefineagroupofclassesthathavesimilarfeaturesandshowcommonbehavior,wecandefineabaseclassandtheninherittheclassesfromit.Inthederivedclasses,wehavethechoicetoeitherusethebaseclassversion......
  • python3 unittest+BeautifulReport单个进程输出多个测试报告
    最近一个项目中需要由于输出的案例内容非常多(上万条),导致BeautifulReport输出的报告内容非常大(几百兆)。浏览器无法正常处理这么大的测试报告,就算打开了,也不方便阅读和处理,因此需要将报告分成多个输出。经修改代码,发现单个进程内输出多个测试报告出现问题:第一个测试报告能正常数据......
  • 具有自引用的类装饰器的 Python 类型提示
    我的最终目标是编写一个系统来轻松记录函数调用(特别是类方法)。我首先编写一个带有包装方法的类Loggable,该方法允许我装饰子类方法并记录它们的调用|||现在我可以编写子类并记录它们的调用:Param=ParamSpec("Param")RetType=TypeVar("RetType")CountType=......
  • 如何在for循环中使用curve_fit函数在python中一次性创建多个回归?
    简而言之,我有两个矩阵,一个称为t,另一个称为y。每个都有7列。假设它们被称为a、b、c、d、e、f和g。我想要的是从a对a、b对b、...、g对g这两个矩阵进行回归。我已经设法使我的算法使用curve_fit对一列进行回归一次。但我真正希望的是它能够一次性完成7个回归......