2024-06-08 02:51:53 发布
网友
如果没有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
是的,您可以在不使用任何模块的情况下读入那些csv文件,但这比使用csv或pandas或类似模块更困难。我将在这里给你一些想法,但由于你没有显示自己的代码,我不会显示自己的代码。如果你想要代码,尝试一下这里的一些东西,让我们知道你尝试了什么。你知道吗
csv
pandas
你的第一步就是明白你想做什么。你的用户界面是什么?如果用户键入的名称被多部电影使用,该怎么办?电影或者有多个名字(化名)的人呢?等等。你知道吗
你的第二步是理解你拥有的数据。例如,all_movies.csv实际上是一个逗号分隔的文件。每一行都是文本,我相信UTF-8编码的一些电影名字是用希伯来语或阿拉伯语。行由换行符(无回车符)分隔。每行有四个字段。除值\N似乎是空标记外,每个字段都用双引号字符括起来。字段由一个逗号分隔,没有空格字符。第一行是包含字段名的头:"id","name","parent_id","date"。您需要前两个字段:每个电影的唯一ID(以十进制形式表示为正整数)和名称(可能不唯一)。你知道吗
all_movies.csv
\N
"id","name","parent_id","date"
下一步是确定数据结构,使您能够合理地使用时间和内存来获得所需的内容。例如,您可能需要一个字典,其中每个键都是电影名称,其对应值是具有该名称的电影的id列表。(一个defaultdict会更好,但这需要collections模块。)您可能不需要all_movies.csv文件中的其他两个字段。您还需要一个字典,其键是电影ID,值是电影中人物的人物ID列表,以及一个字典,其键是人物ID,值是人物姓名,也许还有关于人物的其他数据。你知道吗
collections
在您解决了这些决定之后(至少是暂时的),您可以开始编写读取电影文件并为电影IDs字典创建名称的例程。首先打开文本文件并检查第一个标题行作为健全性检查。然后,对于每一行,您尝试执行以下操作:
find()
start
int
\
\"
"
Making Frankensense of \"Young Frankenstein\"
等等。你明白吗?您不能只在逗号上拆分文本行,这是当前的两个答案所做的,因为某些电影名称包含逗号(例如ID号为9的Sonntag, im August)。你需要在双引号上换行。我上面写的另一种方法是split双引号字符上的行,然后检查结果字段列表,但是转义的双引号和\N空标记会使这变得困难。你知道吗
Sonntag, im August
split
另一个选择,我会研究的,是写一个例程只扫描一个区域。它将区分空字段和其他字段,所有字段都以双引号开始和结束。它的运行速度比我上面概述的要慢,但是可以用来读取另外两个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", ";"))
是的,您可以在不使用任何模块的情况下读入那些csv文件,但这比使用
csv
或pandas
或类似模块更困难。我将在这里给你一些想法,但由于你没有显示自己的代码,我不会显示自己的代码。如果你想要代码,尝试一下这里的一些东西,让我们知道你尝试了什么。你知道吗你的第一步就是明白你想做什么。你的用户界面是什么?如果用户键入的名称被多部电影使用,该怎么办?电影或者有多个名字(化名)的人呢?等等。你知道吗
你的第二步是理解你拥有的数据。例如,
all_movies.csv
实际上是一个逗号分隔的文件。每一行都是文本,我相信UTF-8编码的一些电影名字是用希伯来语或阿拉伯语。行由换行符(无回车符)分隔。每行有四个字段。除值\N
似乎是空标记外,每个字段都用双引号字符括起来。字段由一个逗号分隔,没有空格字符。第一行是包含字段名的头:"id","name","parent_id","date"
。您需要前两个字段:每个电影的唯一ID(以十进制形式表示为正整数)和名称(可能不唯一)。你知道吗下一步是确定数据结构,使您能够合理地使用时间和内存来获得所需的内容。例如,您可能需要一个字典,其中每个键都是电影名称,其对应值是具有该名称的电影的id列表。(一个defaultdict会更好,但这需要
collections
模块。)您可能不需要all_movies.csv
文件中的其他两个字段。您还需要一个字典,其键是电影ID,值是电影中人物的人物ID列表,以及一个字典,其键是人物ID,值是人物姓名,也许还有关于人物的其他数据。你知道吗在您解决了这些决定之后(至少是暂时的),您可以开始编写读取电影文件并为电影IDs字典创建名称的例程。首先打开文本文件并检查第一个标题行作为健全性检查。然后,对于每一行,您尝试执行以下操作:
find()
string方法,使用start
选项跳过已经找到的双引号。你知道吗int
值。你知道吗\
时,将\"
转换为"
并搜索下一个双引号字符。这是必需的,因为有些电影名称包含双引号,在文件中转义为\"
。例如Making Frankensense of \"Young Frankenstein\"
,其ID为3161。你知道吗等等。你明白吗?您不能只在逗号上拆分文本行,这是当前的两个答案所做的,因为某些电影名称包含逗号(例如ID号为9的
Sonntag, im August
)。你需要在双引号上换行。我上面写的另一种方法是split
双引号字符上的行,然后检查结果字段列表,但是转义的双引号和\N
空标记会使这变得困难。你知道吗另一个选择,我会研究的,是写一个例程只扫描一个区域。它将区分空字段和其他字段,所有字段都以双引号开始和结束。它的运行速度比我上面概述的要慢,但是可以用来读取另外两个csv文件。如果你展示了你自己的一些作品,我可以展示实现这一点的代码。你知道吗
就像解析文本文件一样
作为发电机:
其中filepath是要读取的文件,separator是要拆分的标记,header是返回初始行作为头的标志。你知道吗
例如调用:
相关问题 更多 >
编程相关推荐