首页 > 编程问答 >我看不懂这个python脚本?

我看不懂这个python脚本?

时间:2024-07-27 08:21:46浏览次数:11  
标签:python

用于加载.dat文件的Python脚本

import csv
from django.core.management.base import BaseCommand
from recommender.models import User, Artist, Tag, UserArtist, UserTaggedArtist, UserFriend
import os
from django.conf import settings

# Define the path to the database directory
Database_path = os.path.join(settings.BASE_DIR, 'mldata')

class Command(BaseCommand):
    help = 'Load data from .dat files into the databases'

    def handle(self, *args, **kwargs):
        self.create_default_users()
        self.load_artists()
        self.load_tags()
        self.load_user_artists()
        self.load_user_tagged_artists()
        self.load_user_friends()

    def create_default_users(self):
        users = [
            {'username': 'User1', 'email': '[email protected]'},
            {'username': 'User2', 'email': '[email protected]'}
        ]
        for user in users:
            User.objects.get_or_create(username=user['username'], email=user['email'])

    def load_artists(self):
        with open(os.path.join(Database_path, 'artists.dat'), 'r', encoding='utf-8', errors='replace') as file:
            reader = csv.reader(file, delimiter='\t')
            next(reader)
            for row in reader:
                artist_id, artist_name = row[0], row[1]
                Artist.objects.get_or_create(artist_id=artist_id, defaults={'artist_name': artist_name})

    def load_tags(self):
        with open(os.path.join(Database_path, 'tags.dat'), 'r', encoding='utf-8', errors='replace') as file:
            reader = csv.reader(file, delimiter='\t')
            next(reader)
            for row in reader:
                tag_id, tag_name = row[0], row[1]
                Tag.objects.get_or_create(tag_id=tag_id, defaults={'tag_name': tag_name})

    def load_user_artists(self):
        with open(os.path.join(Database_path, 'user_artists.dat'), 'r', encoding='utf-8', errors='replace') as file:
            reader = csv.reader(file, delimiter='\t')
            next(reader)
            for row in reader:
                user_id, artist_id, listening_count = row[0], row[1], row[2]
                user = User.objects.get(id=user_id)
                artist = Artist.objects.get(artist_id=artist_id)
                UserArtist.objects.get_or_create(user=user, artist=artist, defaults={'listening_count': listening_count})

    def load_user_tagged_artists(self):
        with open(os.path.join(Database_path, 'user_taggedartists.dat'), 'r', encoding='utf-8', errors='replace') as file:
            reader = csv.reader(file, delimiter='\t')
            next(reader)
            for row in reader:
                user_id, artist_id, tag_id, timestamp = row[0], row[1], row[2], row[3]
                user = User.objects.get(id=user_id)
                artist = Artist.objects.get(artist_id=artist_id)
                tag = Tag.objects.get(tag_id=tag_id)
                UserTaggedArtist.objects.get_or_create(user=user, artist=artist, tag=tag, defaults={'timestamp': timestamp})

    def load_user_friends(self):
        with open(os.path.join(Database_path, 'user_friends.dat'), 'r', encoding='utf-8', errors='replace') as file:
            reader = csv.reader(file, delimiter='\t')
            next(reader)
            for row in reader:
                user_id, friend_id = row[0], row[1]
                user = User.objects.get(id=user_id)
                friend = User.objects.get(id=friend_id)
                UserFriend.objects.get_or_create(user=user, friend=friend)

错误

  File "C:\Users\ADMIN\OneDrive\Desktop\rml\myenv\Lib\site-packages\django\db\models\query.py", line 649, in get
    raise self.model.DoesNotExist(
recommender.models.User.DoesNotExist: User matching query does not exist.

我这是什么,我不盲目地模仿,但我似乎不明白它到底想做什么,并且错误不断重复出现。

有人可以解释一下这段代码是什么吗是以及如何修复该错误


这段 Python 脚本用于将 Last.fm 数据集(以.dat 文件形式提供)加载到 Django 应用程序的数据库中。让我们将其分解为各个部分:

1. 导入语句

  • import csv :这行代码导入用于处理 CSV(逗号分隔值)文件的 csv 模块。在本例中,它用于读取以制表符分隔的 .dat 文件。
  • from django.core.management.base import BaseCommand :这从 Django 导入 BaseCommand 类,允许你创建自定义管理命令。
  • from recommender.models import User, Artist, Tag, UserArtist, UserTaggedArtist, UserFriend :这从你的 Django 应用程序(“recommender”)中导入必要的模型,以代表数据库中的不同实体(用户、艺术家、标签、用户与艺术家之间的关系等)。
  • import os :这将导入 os 模块,以处理与操作系统相关的功能,例如构建文件路径。
  • from django.conf import settings :这将导入 settings ,让你访问 Django 项目的配置设置。

2. Database_path 变量

  • Database_path = os.path.join(settings.BASE_DIR, 'mldata') :这行代码定义了存储 .dat 文件的数据库目录的路径。它使用 os.path.join 以独立于平台的方式连接路径组件。 settings.BASE_DIR 指的是 Django 项目的根目录, mldata 是数据库目录的名称。

3. Command

  • 这段代码定义了一个继承自 Django BaseCommand 类的自定义管理命令。这让你可以通过 Django 的命令行界面运行 Python 脚本。

4. handle() 方法

  • handle() 方法是当你运行此管理命令时调用的主要入口点。它调用其他方法来加载不同的数据集。

5. 数据加载方法

  • create_default_users() :此方法创建两个默认用户(“User1”和“User2”)及其电子邮件地址。它使用 get_or_create() 以避免创建重复的用户。
  • load_artists() load_tags() load_user_artists() load_user_tagged_artists() load_user_friends() :这些方法遵循类似的模式来加载不同的数据集。
    • 它们打开一个特定的 .dat 文件以进行读取 ( 'r' ),使用 utf-8 编码,并用 csv.reader 处理制表符分隔的数据。
    • 它们跳过第一行(标题行),使用 next(reader)
    • 它们遍历文件的每一行,提取相关数据,然后使用 get_or_create() 在相应数据库表中创建对象。这可以确保不会创建重复的条目。

错误及修复

你遇到的错误是 recommender.models.User.DoesNotExist: User matching query does not exist. 这意味着你的脚本试图访问一个 ID 不存在于你的 User 表中的 User 对象。这可能发生在 load_user_artists() load_user_tagged_artists() load_user_friends() 方法中,其中脚本使用从 .dat 文件中读取的 user_id 来获取 User 对象。

为了解决这个问题,你需要确保你的 .dat 文件中引用的 user_id 存在于你的数据库中。你可以执行以下操作:

  1. 验证你的数据: 检查你的 .dat 文件,确保 user_id 是正确的,并且与你的 User 表中的现有用户相对应。
  2. 在加载其他数据之前加载用户数据: 确保你的脚本首先加载 users.dat 文件(或包含用户信息的文件),然后再加载引用用户的其他文件。
  3. 调整数据加载顺序: 如果你的 .dat 文件中有依赖关系(例如, user_artists.dat 依赖于 users.dat artists.dat ),请确保按照正确的顺序加载文件。

通过仔细检查你的数据和脚本的执行流程,你应该能够识别出不一致之处,并解决 User.DoesNotExist 错误。

标签:python
From: 78800221

相关文章

  • 使用操作系统工具通过 Python 3 扫描图像
    我正在使用python构建一个应用程序,它需要能够连接到扫描仪并处理生成的pdf/jpeg/其他文件中的数据。我一直在尝试找到一种连接到扫描仪以请求扫描的方法,但没有真正的进展。我已经查看了我能找到的所有选项,包括这个答案:我想连接我的图像扫描仪程序我发现的大多......
  • Python,pandas从字符串中解析数字和字符串
    在Python中,我想解析一个字符串并将数字部分(可能有也可能没有小数点)作为浮点数返回,并将后缀作为字符串返回。示例为:7.1英寸->7.1,英寸7.1”->7.1,“7英寸->7.0,英寸-10dB->-10.0,dB-10.2dB->-10.2,dB数字部分和后缀之间没有空格。另外,我想将其应......
  • 如何在 Python 中加载站点的所有资源,包括 AJAX 请求等?
    我知道如何使用Python请求网站并读取其文本。过去,我曾尝试使用像BeautifulSoup这样的库来发出对网站上链接的所有请求,但这并没有得到看起来不像完整URL的内容,例如AJAX请求和大多数对原始域(因为“http://example.com”将丢失,更重要的是,它不是<ahref='url'>......
  • 使用Python进行PDF旋转
    使用python旋转扫描的pdf后,它工作得很好,但将pdf发送给第三方后,第三方仍然将pdf检测为90度pdf有什么办法可以解决旋转和这个问题importPyPDF2withopen('input.pdf','rb')asfile:#CreateaPDFreaderobjectreader=PyPDF2.PdfReader(file)......
  • Python win32serviceutil QueryServiceStatus:返回值是什么意思?
    我正在学习使用pywin32,并尝试在64位Python3.6.4上使用win32serviceutil模块以下代码:importwin32serviceutilasserviceserviceStatus=service.QueryServiceStatus("WinDefend")print(serviceStatus)返回以下元组:(16,4,197,0,0,0,0)我对wind......
  • Python request-html 未下载 Chromium
    importrequestsfrombs4importBeautifulSoupfromrequests_htmlimportHTMLSessionurl="https://dmarket.com/ingame-items/item-list/csgo-skins?title=recoil%20case"sesion=HTMLSession()response=sesion.get(url)response.html.render()soup=B......
  • VS Code 不改变 python 环境
    我正在使用VS-Code和anaconda环境作为python解释器。我通过ctrl+shift+`选择准确的anaconda基础环境,它也反映在vscode的下侧面板中。但是,当我检查python版本时,它显示我系统的默认python环境3.7.9如果您看到下面的截图,anaconda环境是3.......
  • 使用 Python 打开保存为 Parquet 文件中元数据的 R data.table
    使用R,我创建了一个Parquet文件,其中包含一个data.table作为主要数据,另一个data.table作为元数据。library(data.table)library(arrow)dt=data.table(x=c(1,2,3),y=c("a","b","c"))dt2=data.table(a=22222,b=45555)attr(dt,&......
  • Python 需要 Windows 长路径
    我尝试运行此安装:pip3installmsgraph-sdk它给了我这个错误:它说我需要使用此链接启用Windows长路径:https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=registry#enable-long-paths-in-windows-10-versi......
  • Python griddata() 和 Matlab griddata():某些网格点的结果不同
    在将一些(相当大的物理)Matlab代码转换为Python时,我偶然发现了这种情况。当对相同的二维离散数据进行插值时,Python/Scipy的griddata()函数给出的结果与Matlab的对应函数不同。griddata()Matlab示例代码:Python示例代码:%Samplepoints(x,y):7x5=3......