我知道,标题听起来有点令人困惑,作为Python的新手,我不知道如何更好地使用它。
这就是我想要做的事情:
我的脚本将读取csv文件(电子表格)并从中创建新的电子表格,除了数字之外不包含任何其他内容。基本上,此脚本通过删除包含它们的行和列来消除不需要的字符串。我设法创建了一个正常运行的脚本,尽管它只能应用于单个文件。换句话说,每次我想在另一个csv文件上运行它时,我都需要更改脚本中的输入文件名。
我的文件有这种类型的名称:“MODEL XXXXXXXXX __ NAME Y _alfa Z .csv”其中X,Y和Z是数字。 我想将这些文件的名称作为输入传递给我的Python脚本,所以我使用了sys.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)
我像这样运行我的脚本:
python script.py MODELXXXXXXXXX_NAMEY_alfaZ.csv
现在我要做的是自动化我的脚本,即摆脱“MODELXXXXXXXXX”部分而不必写“NAME Y _alfa Z “每次我想将我的脚本应用到另一个文件时输出文件。
有没有办法做到这一点?
由于
答案 0 :(得分:1)
由于文件名中的MODELXXXXX...
部分用文件名的其余部分用双下划线分隔,因此您只需将输入文件名中从开头到下两个下划线的所有内容分开即可获得输出文件名,例如:
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()
语句中使用这两个而不是硬编码值。
编辑 - 如果您还要修改没有扩展名的基本名称,可以将其扩展为以下内容:
input_file = sys.argv[1] # e.g. MODELXXXXXXXXX__NAMEY_alfaZ.csv
file_extension = input_file[input_file.rfind("."):] # in case we have multiple extensions
base_name = input_file[input_file.find("__") + 2:-len(file_extension)]
output_file = base_name + file_extension # you get NAMEY_alfaZ.csv
# but you can also generate your output file names
output_file1 = base_name + "_test1" + file_extension # NAMEY_alfaZ_test1.csv
output_file2 = base_name + "_test2" + file_extension # NAMEY_alfaZ_test2.csv
# etc.
答案 1 :(得分:1)
如果文件名不包含多个__
,那么您可以使用:
import sys
input_file = sys.argv[1]
output_file = input_file.split("__")[1]
如果双下划线是输入错误,您可以使用:
import sys
input_file = sys.argv[1]
output_file = ''.join(input_file.split("_")[1:])
这样,它会从列表中删除第一个项目(所以" MODELXXXXXXXXX"),然后将列表重新加入。
答案 2 :(得分:0)
您的输入文件名采用常规格式,因此我建议您使用Python regular expressions来提取相关信息。
在您的情况下,您可以按如下方式准备正则表达式:
re_input = re.compile('MODEL(?P<model>\d+)__NAME(?P<name>\d)_alfa(?P<alpha>\d).csv')
然后,您可以使用match
和group
匹配并提取所需信息。
例如,要获得model
,请执行以下操作:
match = re_input.match(input_file)
model = match.group('model')
你的例子应该是这样的:
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+
,反之亦然,以匹配文件名中的位数。