从没有模块的csv文件读取内容

2024-06-08 02:51:53 发布

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

如果没有csv模块或其他模块,如何读取.csv文件?我有两个电影名字和演员的档案要看。用户需要输入一个名称并返回该电影中的所有演员。有没有可能没有任何模块?你知道吗

文件: 全部_电影.csv https://dox.abv.bg/download?id=960cefd34e

全部_人物.csv https://dox.abv.bg/download?id=13c9a04273

全部_铸件.csv https://dox.abv.bg/download?id=9fa805b24b


Tags: 模块文件csv用户https名称id电影
3条回答

是的,您可以在不使用任何模块的情况下读入那些csv文件,但这比使用csvpandas或类似模块更困难。我将在这里给你一些想法,但由于你没有显示自己的代码,我不会显示自己的代码。如果你想要代码,尝试一下这里的一些东西,让我们知道你尝试了什么。你知道吗

你的第一步就是明白你想做什么。你的用户界面是什么?如果用户键入的名称被多部电影使用,该怎么办?电影或者有多个名字(化名)的人呢?等等。你知道吗

你的第二步是理解你拥有的数据。例如,all_movies.csv实际上是一个逗号分隔的文件。每一行都是文本,我相信UTF-8编码的一些电影名字是用希伯来语或阿拉伯语。行由换行符(无回车符)分隔。每行有四个字段。除值\N似乎是空标记外,每个字段都用双引号字符括起来。字段由一个逗号分隔,没有空格字符。第一行是包含字段名的头:"id","name","parent_id","date"。您需要前两个字段:每个电影的唯一ID(以十进制形式表示为正整数)和名称(可能不唯一)。你知道吗

下一步是确定数据结构,使您能够合理地使用时间和内存来获得所需的内容。例如,您可能需要一个字典,其中每个键都是电影名称,其对应值是具有该名称的电影的id列表。(一个defaultdict会更好,但这需要collections模块。)您可能不需要all_movies.csv文件中的其他两个字段。您还需要一个字典,其键是电影ID,值是电影中人物的人物ID列表,以及一个字典,其键是人物ID,值是人物姓名,也许还有关于人物的其他数据。你知道吗

在您解决了这些决定之后(至少是暂时的),您可以开始编写读取电影文件并为电影IDs字典创建名称的例程。首先打开文本文件并检查第一个标题行作为健全性检查。然后,对于每一行,您尝试执行以下操作:

  • 检查行的第一个字符是否为双引号。如果不是,就把这条线当作坏的。你知道吗
  • 在已找到的双引号字符之后搜索第一个双引号字符。您可以使用Python的find()string方法,使用start选项跳过已经找到的双引号。你知道吗
  • 确保这两个双引号之间的文本都是十进制数字,然后转换为int值。你知道吗
  • 确保最后一个双引号后面的两个字符是逗号,然后是另一个双引号。你知道吗
  • 找到下一个双引号。当双引号前面的字符是反斜杠\时,将\"转换为"并搜索下一个双引号字符。这是必需的,因为有些电影名称包含双引号,在文件中转义为\"。例如Making Frankensense of \"Young Frankenstein\",其ID为3161。你知道吗
  • 将第3个和第4个双引号之间的文本保存为电影名称。你知道吗
  • 忽略行的其余部分(可能)。你知道吗
  • 如果需要,请使用电影名称和ID创建具有该名称的新字典键,然后将ID附加到电影ID列表中。你知道吗

等等。你明白吗?您不能只在逗号上拆分文本行,这是当前的两个答案所做的,因为某些电影名称包含逗号(例如ID号为9的Sonntag, im August)。你需要在双引号上换行。我上面写的另一种方法是split双引号字符上的行,然后检查结果字段列表,但是转义的双引号和\N空标记会使这变得困难。你知道吗

另一个选择,我会研究的,是写一个例程只扫描一个区域。它将区分空字段和其他字段,所有字段都以双引号开始和结束。它的运行速度比我上面概述的要慢,但是可以用来读取另外两个csv文件。如果你展示了你自己的一些作品,我可以展示实现这一点的代码。你知道吗

就像解析文本文件一样

with open('file.csv', 'r') as f:
    for line in f.read().splitlines():
        data = line.split(',')

作为发电机:

def readCSV(filepath, separator, header=false):
    with open(filepath, "r") as f:
        if header:
            yield next(f)
        for l in f:
            yield l.split(separator)

其中filepath是要读取的文件,separator是要拆分的标记,header是返回初始行作为头的标志。你知道吗

例如调用:

data = list(readCSV("file.csv", ";"))

相关问题 更多 >

    热门问题