从输入中获取字符串,并挑选出该文本的一部分以从字典中打印其定义

Take string from an input, and pick out part of that text to print its definition from a dictionary

我对 python 比较陌生,我编写了一些非常简单的代码,并且正在努力实现一个提示用户输入文件名的程序(例如: cat.png) 然后输出该文件的媒体类型(例如:.png)。如果文件名以以下任何后缀结尾(不区分大小写):

-.gif
-.jpg
-.jpeg
-.png
-.pdf
-.txt
-.zip

那我要打印出它对应的意思:

-image/gif
-image/jpeg
-image/jpeg
-image/png
-application/text
-text/plain
-application/zip

例如:

My desired output:
$ python extensions.py
File name: cat.gif
image/gif
$ python extensions.py
File name: cat.jpg
image/jpg

我尝试使用字典来解决这个问题,将名称与其相应的格式相匹配:

file_name = input('File name: ').strip().lower()
extensions = [
    {'name': '.gif', 'format': 'image/gif' },
    {'name': '.jpg', 'format': 'image/jpeg' },
    {'name': '.jpeg', 'format' :'image/jpeg' },
    {'name': '.png', 'format': 'image/png' },
    {'name': '.pdf', 'format': 'application/text' },
    {'name': '.txt', 'format': 'text/plain' },
    {'name': '.zip', 'format': 'application/zip' }
    ]

问题是,我不知道如何将像 cat.png 这样的用户输出转换成像 .png 这样的文件,并像上图那样在终端上打印为 image/png。我试图找到一种方法,以某种方式将 .png 部分从 'cat.png' 中取出,并通过字典传递它,打印出 image/png.

感谢您阅读这篇冗长的说明。有人可能有实施这样一个程序的想法吗?

如果文件名真的只是文件名加一个点,那么你可以使用.split()获取扩展名:

file_extension = file_name.split('.')[-1]

作为解释:split.('.') 将您输入的字符串拆分为点作为分隔符,returns 为列表,[-1] 索引为您提供最后一个该列表中的项目,即扩展名。

然后您可以在字典中查找该扩展名。

这应该不是什么大问题。

  • 首先,创建一个包含 {extension:explanation} 项的字典。
  • 然后,要求用户输入文件名。
  • 然后,将文件名以点分割,取点后的部分。您可以为此使用 partition 方法。
  • 最后,查询你的字典并return输出。

代码:

# First, create a dictionary of {extension:explanation} items.
extensions_dict {
    'png': 'image/media'
    # put as much as you wish
}

# Then, ask the user to enter the filename.
user_file = input('file name: ')

# Then, split the file name by dot, take the part after dot.
file_name, dot, file_extension = user_file.partition('.')

# Finally, query your dictionary and return the output.
# You can print a message to the user as a default 
# if the extension is not in your dictionary
print(extensions_dict.get(
  file_extension,
  f'I cannot understand your extension ({file_extension}) :('
)
import os

file_name = 'cat.png'
extensions = {
    '.gif': 'image/gif',
    '.jpg': 'image/jpeg' ,
    '.jpeg': 'image/jpeg' ,
    '.png': 'image/png' ,
    '.pdf': 'application/text' ,
    '.txt': 'text/plain' ,
    '.zip': 'application/zip'
    }

print(extensions[os.path.splitext(file_name)[1]])

所以首先,我已经更改了 extensions 的结构 - 没有必要如此重复并保留一个很难浏览的字典列表。使用扩展作为键,您可以直接引用它们以找到相应的格式。

然后您可以使用 Python os.path 模块中的 splitext 方法来获取表示文件扩展名的字符串(比 str.split 对于各种边缘情况更有效)

其他解决方案都可以。但我想为您提供一种更 pythonic 的方式,使用 Pythons pathlib 包以独立于平台的方式和一些其他调整来处理文件路径对象。

#!/usr/bin/env python3
import pathlib  # recommended way with Python3

media_types_dict = {
    'png': 'image/media',
    'gif': 'image/gif',
    # ...
}

# ask the user
user_file = input('file name: ')

# convert to a file path object
user_file = pathlib.Path(user_file)

# get the extension (with the trailing dot, e.g. ".png")
extension = user_file.suffix

# remove the dot
extension = extension[1:]

try:
    # get the media type
    media_type = media_types_dict[extension.lower()]
except KeyError:  # if the extensions is not present in the dict
    raise Exception(f'The extension "{extension}" is unknown.')

# output the result
print(media_type)