Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Shell脚本提取列表中没有扩展名的文件名_Python - Fatal编程技术网

Python 使用Shell脚本提取列表中没有扩展名的文件名

Python 使用Shell脚本提取列表中没有扩展名的文件名,python,Python,假设我有一个字符串,其中包含多个路径文件,如下所示: from sys import argv incoming_strings = argv clean_strings_list = [] if isinstance(incoming_strings, list): for string_to_cut in incoming_strings: if "app" in string_to_cut: string_to_cut_ = string_

假设我有一个字符串,其中包含多个路径文件,如下所示:

from sys import argv

incoming_strings = argv
clean_strings_list = []
if isinstance(incoming_strings, list):
    for string_to_cut in incoming_strings:
        if "app" in string_to_cut:
            string_to_cut_ = string_to_cut.split('/')
            string_to_cut__ = string_to_cut_[len(string_to_cut_) - 1]
            string_to_cut = string_to_cut__.split('.')[0]
            clean_strings_list.append(string_to_cut)
    print(clean_strings_list)
else:
    string_to_cut_ = incoming_strings.split('/')
    string_to_cut__ = string_to_cut_[len(string_to_cut_)-1]
    string_to_cut = string_to_cut__.split('.')[0]
    print(string_to_cut)
“mydrive/mypath/myapp/first_app.java、mydrive/mypath/myapp/second_app.java、mydrive/mypath/myapp/third_app.java”。 从这个字符串中,我只提取不带文件扩展名的文件名,并构建一个新的字符串列表,如下所示:

from sys import argv

incoming_strings = argv
clean_strings_list = []
if isinstance(incoming_strings, list):
    for string_to_cut in incoming_strings:
        if "app" in string_to_cut:
            string_to_cut_ = string_to_cut.split('/')
            string_to_cut__ = string_to_cut_[len(string_to_cut_) - 1]
            string_to_cut = string_to_cut__.split('.')[0]
            clean_strings_list.append(string_to_cut)
    print(clean_strings_list)
else:
    string_to_cut_ = incoming_strings.split('/')
    string_to_cut__ = string_to_cut_[len(string_to_cut_)-1]
    string_to_cut = string_to_cut__.split('.')[0]
    print(string_to_cut)
“第一应用、第二应用、第三应用”等

我当前的实现是用Python实现的,如下所示:

from sys import argv

incoming_strings = argv
clean_strings_list = []
if isinstance(incoming_strings, list):
    for string_to_cut in incoming_strings:
        if "app" in string_to_cut:
            string_to_cut_ = string_to_cut.split('/')
            string_to_cut__ = string_to_cut_[len(string_to_cut_) - 1]
            string_to_cut = string_to_cut__.split('.')[0]
            clean_strings_list.append(string_to_cut)
    print(clean_strings_list)
else:
    string_to_cut_ = incoming_strings.split('/')
    string_to_cut__ = string_to_cut_[len(string_to_cut_)-1]
    string_to_cut = string_to_cut__.split('.')[0]
    print(string_to_cut)
我需要用Bash脚本实现以下代码。正确的方法是什么?
谢谢

使用bash,您可以在“,”上拆分路径,使用
IFS
like

$ path="mydrive/mypath/myapp/first_app.java, mydrive/mypath/myapp/second_app.java, mydrive/mypath/myapp/third_app.java"
$ IFS=, read -ra paths <<<"$path" # read into an array, by splitting the path on `,`
$ for path in "${paths[@]}"
> do
>   filename="${path##*/}" # strip whatever is before final /
>   filename="${filename%.*}" # strip the extension
>   echo "$filename"
> done
first_app
second_app
third_app
如果你只想知道名字

>>> names_without_exts, _ = zip(*details)
>>> names_without_exts
('first_app', 'second_app', 'third_app')
或者直接使用,

>>> [os.path.splitext(os.path.basename(p))[0] for p in path.split(',')]
['first_app', 'second_app', 'third_app']
>>> [pathlib.Path(p).stem for p in path.split(',')]
['first_app', 'second_app', 'third_app']

使用bash,您可以在“,”上拆分路径,使用
IFS
like

$ path="mydrive/mypath/myapp/first_app.java, mydrive/mypath/myapp/second_app.java, mydrive/mypath/myapp/third_app.java"
$ IFS=, read -ra paths <<<"$path" # read into an array, by splitting the path on `,`
$ for path in "${paths[@]}"
> do
>   filename="${path##*/}" # strip whatever is before final /
>   filename="${filename%.*}" # strip the extension
>   echo "$filename"
> done
first_app
second_app
third_app
如果你只想知道名字

>>> names_without_exts, _ = zip(*details)
>>> names_without_exts
('first_app', 'second_app', 'third_app')
或者直接使用,

>>> [os.path.splitext(os.path.basename(p))[0] for p in path.split(',')]
['first_app', 'second_app', 'third_app']
>>> [pathlib.Path(p).stem for p in path.split(',')]
['first_app', 'second_app', 'third_app']

通过使用
re.search
,您可以使用正则表达式仅提取所需的部分

重新导入
strings=[“mydrive/mypath/myapp/first_app.java”、“mydrive/mypath/myapp/second_app.java”、“mydrive/mypath/myapp/third_app.java”]
对于字符串中的字符串:
a=重新搜索(“\/([^\/]*)\.[^\.\/]*$”,字符串)
a、 第(1)组
这将产生:

'first_app'
'second_app'
'third_app'

您可以对此进行测试。

您可以使用正则表达式通过使用
re.search
仅提取所需的部分

重新导入
strings=[“mydrive/mypath/myapp/first_app.java”、“mydrive/mypath/myapp/second_app.java”、“mydrive/mypath/myapp/third_app.java”]
对于字符串中的字符串:
a=重新搜索(“\/([^\/]*)\.[^\.\/]*$”,字符串)
a、 第(1)组
这将产生:

'first_app'
'second_app'
'third_app'

您可以对此进行测试。

针对您的问题,它有很多解决方案,这里有一个建议:

Python

st='mydrive/mypath/myapp/first_app.java,mydrive/mypath/myapp/second_app.java,mydrive/mypath/myapp/third_app.java' >>>导入操作系统 >>>对于st.strip()中的s。拆分(“,”): ... fname=os.path.basename.split(“.”[0] ... 打印(fname) 第一个应用程序 第二个应用程序 第三个应用程序 Bash

st='mydrive/mypath/myapp/first_app.java,mydrive/mypath/myapp/second_app.java,mydrive/mypath/myapp/third_app.java'
OLDIFS=$IFS//获取默认IFS
IFS=“,”//将逗号设置为分隔符

read-ra ADDR它为您的问题提供了很多解决方案,这里有一个建议:

Python

st='mydrive/mypath/myapp/first_app.java,mydrive/mypath/myapp/second_app.java,mydrive/mypath/myapp/third_app.java' >>>导入操作系统 >>>对于st.strip()中的s。拆分(“,”): ... fname=os.path.basename.split(“.”[0] ... 打印(fname) 第一个应用程序 第二个应用程序 第三个应用程序
Bash

st='mydrive/mypath/myapp/first_app.java,mydrive/mypath/myapp/second_app.java,mydrive/mypath/myapp/third_app.java'
OLDIFS=$IFS//获取默认IFS
IFS=“,”//将逗号设置为分隔符

read-ra ADDR要将字符串拆分为几段,可以使用
echo$yourstring | tr,“\n”
。要删除目录部分和.java扩展名,最简单的方法(从编程工作的角度来看)是使用
basename
命令,尽管也存在其他可能性。要将字符串拆分为多个部分,可以使用
echo$yourstring | tr,“\n”
。要删除目录部分和.java扩展名,最简单的方法(从编程工作的角度来看)是使用
basename
命令,尽管也存在其他可能性。您的建议使用Python。OP正在寻找bash程序。@user1934428,谢谢提醒,我只关注他的标签。已使用bash脚本更新了答案。由于您通过使用IFS解决了此问题,因此最好将原始IFS保存到一个变量中,然后再从该变量还原。我们不知道您的代码片段将在哪个上下文中使用,可能IFS已经被修改过了。这是为什么我不喜欢在脚本中间改变这么多IFS的一个原因,虽然我很清楚这被认为是一个很好的实践。你的建议使用Python。OP正在寻找bash程序。@user1934428,谢谢提醒,我只关注他的标签。已使用bash脚本更新了答案。由于您通过使用IFS解决了此问题,因此最好将原始IFS保存到一个变量中,然后再从该变量还原。我们不知道您的代码片段将在哪个上下文中使用,可能IFS已经被修改过了。这是为什么我不喜欢在脚本中间改变这么多IFS的一个原因,尽管我很清楚这被认为是一个普通的好的实践。