Jimmy0329 2024-04-14 19:58 采纳率: 72.7%
浏览 2

python代码问题

大家可以帮我看看哪里出了问题吗

源代码

#version: python 3.11.5
#author: Jimmy Zhang
from random import *
from jieba import posseg
from os import getcwd
pseg=posseg
path_in_thu=getcwd()+"/zw_in/template"
path_out_thu=getcwd()+"/zw_in/raw"
path_out=getcwd()+"/zw_out/"
counter=str(open(getcwd()+'\zw\count.txt', 'r', encoding='utf-8')).split()[1]
types=['n','f','s','t',"nr",'ns','nt','nw','nz','vd','vn','a','ad','an','d','m','q','r','p','c','u','xc','w','per','loc','org','time']
for type in types:
    eval(f"{type}=[]\n")
type={'n':'普通名词','f':'方位名词','s':'处所名词','t':'时间','nr':'人名','ns':'地名','nt':'机构名','nw':'作品名','nz':'其他专名普通动词','vd':'动副词','vn':'名动词','a':'形容词','ad':'副形词','an':'名形词','d':'副词','m':'数量词','q':'量词','r':'代词','p':'介词','c':'连词','u':'助词','xc':'其他虚词','w':'标点符号','PER':'人名','LOC':'地名','ORG':'机构名','TIME':'时间'}
def split(name:str)->None:
    '''Split a string into a template string and put the word in the list of "part of speech"'''
    inpath=generate_complete_path(name,path_in_thu)
    outpath=generate_complete_path(name,path_out_thu)
    outpath_template=generate_complete_path(name,path_in_thu)
    with open(inpath,"r",encoding="utf-8") as f:
        dat=pseg.cut(f)
    with open(outpath,"w",encoding="utf-8") as f:
        for word,flag in dat:
            f.write(f'{word} {flag}/n')
    with open(outpath_template,"w",encoding="utf-8") as f:
        for line in f:
            for flag in dat:
                f.write(f'{flag}\a')
            f.write('\n')
def generate_complete_path(name:str, path:str)->str:
    return path+name
def flag(name:str)->None:
    path=generate_complete_path(path_out_thu,name)
    with open(path,"r",encoding="utf-8") as f:
        for line in f:
            word,flags=line.strip().split()
            eval(f'{flags}.append({word})')
def make(number,template_name=random.sample(),out_name=generate_complete_path('untitled',str(counter)))->None:
    for i in range(number):
        out=generate_complete_path(out_name,path_out_thu)
        template=generate_complete_path(template_name,path_in_thu)
        with open(out,"w",encoding="utf-8") as o:
            with open(template,"r",encoding="utf-8") as i:
                for line in i:
                    line=line.split('\a')
                    for word in line:
                        eval(f'o.write(sample({word}))')
def init():
    inited=False
    eval("open('D:\Jimmy\zw\count.txt', 'r', encoding='utf-8').splitlines()[2]")
    if inited:
        return
    else:
        pass#未完成

错误消息:

[Running] python -u "d:\Jimmy\zw\zw.py"
Traceback (most recent call last):
  File "d:\Jimmy\zw\zw.py", line 13, in <module>
    eval(f"{type}=[]\n")
  File "<string>", line 1
    n=[]
     ^
SyntaxError: invalid syntax

[Done] exited with code=1 in 1.936 seconds

文件目录:

img


count.txt

0
inited=True
datanum=0
---备注---
第一行请不要改动,否则会导致错误
如果在zw_in/raw内添加新文件,请清空zw_in/templates/
并将inited改为false
datanum是zw_in/raw内的文件数量
文件的允许格式:*.txt

type.png

img

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-14 19:58
    关注

    引自免费微信小程序:皆我百晓生

    在您提供的Python代码中,存在一个语法错误,这导致了SyntaxError: invalid syntax。错误发生在第13行,eval(f"{type}=[]\n") 这一行尝试创建一个变量并赋值为列表,但Python解析器认为这是一个无效的语法。

    解决这个问题的方法是在定义列表时去掉换行符\n,因为换行符不是有效的Python列表语法的一部分。下面是修改后的第13行代码:

    eval(f"{type} = []")
    

    除此之外,还有一些其他的建议可以帮助优化您的代码:

    1. 将常量(例如路径、类型等)定义为常量(使用全大写字母命名),这样可以提高代码可读性。
    2. 对于一些重复的操作,比如打开文件,可以考虑封装成函数。
    3. 在循环中使用 with open() 更安全,因为它会在操作完成后自动关闭文件。

    以下是修改后的代码:

    import os
    import random
    import jieba.posseg as pseg
    
    # 常量
    PATH_IN_THU = os.path.join(os.getcwd(), "zw_in", "template")
    PATH_OUT_THU = os.path.join(os.getcwd(), "zw_in", "raw")
    PATH_OUT = os.path.join(os.getcwd(), "zw_out/")
    COUNT_FILE_PATH = os.path.join(os.getcwd(), "zw\\count.txt")
    
    TYPES = ['n', 'f', 's', 't', "nr", 'ns', 'nt', 'nw', 'nz', 'vd', 'vn', 'a', 'ad', 'an', 'd', 'm', 'q', 'r', 'p', 'c', 'u', 'xc', 'w', 'per', 'loc', 'org', 'time']
    
    # 初始化各个类型的列表
    for type in TYPES:
        locals()[type] = []
    
    TYPE_DICT = {
        'n': '普通名词',
        'f': '方位名词',
        's': '处所名词',
        't': '时间',
        'nr': '人名',
        'ns': '地名',
        'nt': '机构名',
        'nw': '作品名',
        'nz': '其他专名',
        'vd': '动副词',
        'vn': '名动词',
        'a': '形容词',
        'ad': '副形词',
        'an': '名形词',
        'd': '副词',
        'm': '数量词',
        'q': '量词',
        'r': '代词',
        'p': '介词',
        'c': '连词',
        'u': '助词',
        'xc': '其他虚词',
        'w': '标点符号',
        'PER': '人名',
        'LOC': '地名',
        'ORG': '机构名',
        'TIME': '时间'
    }
    
    def generate_complete_path(name, path):
        return os.path.join(path, name)
    
    def read_count_file():
        count_file = open(COUNT_FILE_PATH, 'r', encoding='utf-8')
        lines = count_file.readlines()
        count_file.close()
        return int(lines[1].strip())
    
    def split(name):
        inpath = generate_complete_path(name, PATH_IN_THU)
        outpath = generate_complete_path(name, PATH_OUT_THU)
        
        with open(inpath, "r", encoding="utf-8") as f:
            data = pseg.cut(f.read())
            
        with open(outpath, "w", encoding="utf-8") as f:
            for word, flag in data:
                f.write(f'{word} {flag}\n')
    
    def flag(name):
        path = generate_complete_path(name, PATH_OUT_THU)
        with open(path, "r", encoding="utf-8") as f:
            for line in f:
                word, flags = line.strip().split()
                for flag in flags.split(','):
                    eval(f"{flag.lower()}.append({word})")
    
    def make(number, template_name=None, out_name=None):
        if not template_name:
            template_name = random.choice(os.listdir(PATH_IN_THU))
        if not out_name:
            counter = read_count_file()
            out_name = generate_complete_path('untitled', str(counter))
    
        out = generate_complete_path(out_name, PATH_OUT_THU)
        template = generate_complete_path(template_name, PATH_IN_THU)
    
        with open(out, "w", encoding="utf-8") as o:
            with open(template, "r", encoding="utf-8") as i:
                for line in i:
                    line = line.strip().split(',')
                    for word in line:
                        o.write(random.choice(locals()[word]))
    
    def init():
        count_file = open(COUNT_FILE_PATH, 'r', encoding='utf-8')
        lines = count_file.readlines()
        count_file.close()
    
        if lines[2].strip() == 'True':
            print("已初始化")
            return
    
        print("初始化...")
        # TODO: 完成初始化逻辑
    
    if __name__ == "__main__":
        init()
    

    这个版本的代码修复了原始代码中的语法错误,并对部分结构进行了优化。请注意,init 函数目前没有实现完整的逻辑,你需要根据你的需求去完善它。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月14日

悬赏问题

  • ¥15 上传图片时提交的存储类型
  • ¥15 Ubuntu开机显示器只显示kernel,是没操作系统(相关搜索:显卡驱动)
  • ¥15 VB.NET如何绘制倾斜的椭圆
  • ¥15 在rhel8中安装qemu-kvm时遇到“cannot initialize crypto:unable to initialize gcrypt“报错”
  • ¥15 arbotix没有/cmd_vel话题
  • ¥15 paddle库安装时报错提示需要安装common、dual等库,安装了上面的库以后还是显示报错未安装,要怎么办呀?
  • ¥20 找能定制Python脚本的
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀