如何从文件列表开始创建电影数据库

时间:2014-05-14 21:50:19

标签: python database debian

我的家庭服务器上有大量电影(大约4000张)。这些文件都名为Title - Subtitle (year).extension。我想在我的所有电影中创建一个数据库(即使在excel也没关系)。数据库应包含列:标题,副标题(如果存在),文件在服务器上的年份和位置(某些电影按照genre或actor组织在文件夹中)。截至目前,我有一个bash脚本只返回一个txt文件,其中包含每个硬盘驱动器的文件列表(每个文件包含每个硬盘驱动器的列表)。 如何在我的家庭服务器(运行debian)上自动创建这种数据库?

使用某些电影数据库api自动检索有关电影的其他信息也会很棒,但我想这会非常复杂。

1 个答案:

答案 0 :(得分:1)

这是一个非常广泛的问题,在这里并不合适(这是一个教程而不是快速的代码问题),但这里有一些战略建议:

  • Excel将打开.csv并将逗号/新行视为单元格。所以
  • 您需要通过目录(ies)
  • 进行迭代,可能是递归的
  • 扩展路径名 - 如果您使用像Python这样的高级语言,这是通过标准函数实现的;然后使用正则表达式解析最后一位
  • 将每个路径的格式化内容存储为列表中的行
  • 将该列表打印到文本文件,用逗号连接每个元素,每行用新行字符连接
  • 为所述文件提供.csv后缀并在Excel中打开

请注意,如果你真的想要一个正确的数据库,Python再次是一个不错的选择 - SQLite是标准安装的一部分。

欢呼,祝你好运


更新:哈哈,你在我回答时编辑了这个问题。您似乎所需的一切都在文件名中,但如果您计划使用元数据,请注意以下事项。如果不是全部来自同一来源,那么从文件中提取元数据可能会变得更加棘手;并非每种媒体类型都具有相同的元数据结构,并非每个创建文件的应用程序都提供相同的元数据因此,获取元数据的逻辑可能会变得混乱。

是否有理由不能使用现存的程序来执行此操作?

最后你提到在你的网络服务器上获取它;再次推迟到Python,您需要的服务器请求的容量也内置在标准包中。


最终更新

无法帮助你做bash;我在那里大拇指,我也不是Python的专家,但你的目标非常简单。我还没有测试过这个 - 可能有一两个错字,认为伪代码主要是python-ready。

# import the standard libraries you'll need
import os # https://docs.python.org/2/library/os.html
import re # https://docs.python.org/2/library/re.html

# this function will walk your directories and output a list of file paths
def getFilePaths(directory):
    file_paths = []
    for root, directories, files in os.walk(directory):
        for filename in files:
            filepath = os.path.join(root, filename)
            file_paths.append(filepath)
    return file_paths



video_file_paths = getFilePaths("path/to/video/library")
output_to_csv = [];
for video_file in video_file_paths:
    base_path, fname = os.path.split(video_file) 

     """ This is a super simple bit of regex that, provided  your files are all formatted as
     written, will parse out title, subtitle, year and file extension. If your file names
     turn out to have more exceptions than you expect (I'd be shocked if not), you may need
     to make this part more robust, either with much more savvy regex, or else some conditional
     logic—maybe a recursive try... catch loop"""
    reg_ex = re.compile("/^(.*) - (.*) \((.*)\)\.(.*)$/");

    # now apply the compiled regex to each path
    name_components = reg_ex.match(fname);

    """Each output is a row of your CSV file; .join() will join the 4 elements of the regex
    match (assuming, again, that your filenames are as clean as you claim), and then add
    the basepath, so you should be building, in this loop, a list with elements like:
    title, subtitle, year, file_extension, full path"""

    output_to_csv.append("{0},{1}".format(name_components.join(","), base_path));

#create the file, making sure the location is writeable
csv_doc = open("my_video_database.csv", "w");

# now join all the rows with line breaks and write the compiled text to the file
csv_doc.write( ouput_to_csv.join("\n") ); 

#close  your new database
csv_doc.close()