如何提取python脚本中使用的文件名的一部分作为参数?

2024-09-28 01:23:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道,这个标题听起来有点混乱,作为一个Python新手,我不知道如何更好地表达它。在

我想做的是:

我的脚本将读取csv文件(电子表格),并从中创建新的电子表格,这些表格除了数字之外不包含任何其他内容。基本上,这个脚本通过删除包含不需要的字符串的行和列来消除它们。我设法创建了一个正常运行的脚本,尽管它只能应用于单个文件。换句话说,每次我想在另一个csv文件上运行脚本时,我都需要更改脚本中的输入文件名。在

我的文件有这样的名称:“MODELXXXXXXXXX\uu NAMEY\u alfaZ.csv”,其中X、Y和Z是数字。 我想将这些文件的名称作为Python脚本的输入,所以我使用了系统argv[1] 为了达到这个目的。 下面是我的代码示例:

import csv
import sys

strings_to_remove = ['string1','string2']

with open(sys.argv[1],'rb') as oldfile, open('NAMEY_alfaZ_test1.csv','w+b') as newfile:
    for line in oldfile:
        if not in any(strings_to_remove in line for strings_to_remove in strings_to_remove):
            newfile.write(line)

我这样运行脚本:

^{pr2}$

现在我想做的是自动化我的脚本,即去掉“modelxxxxx”部分,而不必在每次我想将脚本应用到另一个文件时为输出文件写“NAMEY\u alfaZ”。在

有办法吗?在

谢谢


Tags: 文件csvtoinimport脚本名称line
3条回答

如果文件名不包含多个__,则可以使用:

import sys
input_file = sys.argv[1]
output_file = input_file.split("__")[1]

如果双下划线是键入错误,可以使用:

^{pr2}$

这样,它将从列表中删除第一项(因此是“Modelxxxxx”),然后将列表重新连接在一起。在

{g文件名中的两个下划线从文件名的另一部分中分离出来

input_file = sys.argv[1]  # e.g. MODELXXXXXXXXX__NAMEY_alfaZ.csv
output_file = input_file[input_file.find("__")+2:]  # you get NAMEY_alfaZ.csv

然后就可以使用这两个值来代替open()语句中的硬编码值。在

编辑-如果还想修改不带扩展名的基名称,可以将其扩展为如下所示:

^{pr2}$

您的输入文件名具有常规格式,因此我建议您使用Python regular expressions来提取相关信息。在

在这种情况下,可以按如下方式准备正则表达式:

re_input = re.compile('MODEL(?P<model>\d+)__NAME(?P<name>\d)_alfa(?P<alpha>\d).csv')

然后可以使用matchgroup匹配并提取所需的信息。在

例如,要获得model,您需要:

^{pr2}$

你的例子应该是:

import re
import csv
import sys

strings_to_remove = ['string1','string2']

re_input = re.compile('MODEL(?P<model>\d+)__NAME(?P<name>\d)_alfa(?P<alpha>\d).csv')

input_file = sys.argv[1]

match = re_input.match(input_file)
model = match.group('model')
name = match.group('name')
alpha = match.group('alpha')

output_file = 'NAME{}_alpha{}_test1.csv'.format(name, alpha)
with open(input_file, 'rb') as oldfile, open(output_file, 'w+b') as newfile:
    for line in oldfile:
        if not in any(strings_to_remove in line for strings_to_remove in strings_to_remove):
            newfile.write(line)

您可能需要调整正则表达式,例如,将\d更改为\d+,或者反之亦然,以匹配文件名中的位数。在

相关问题 更多 >

    热门问题