高溪成 2022-01-18 22:34 采纳率: 66.7%
浏览 74
已结题

Python中csv文件的操作

问题遇到的现象和发生背景

单独编辑csv文件后运行不成功

问题相关代码,请勿粘贴截图
import sys,os
#定义操作列表
ops = ['查询员工工资','修改员工工资','增加新员工记录','删除员工信息','查看全部员工信息','汇总统计','退出']
info = {}
def get_info():
   #读取文件得到员工信息
    global info
    with open('info.csv',mode='r',encoding='utf-8') as f_r:
        for line in f_r:
            line = line.rstrip('\n')
            if line:
                name = line.split(' ')[0]
                slary = line.split(' ')[1]
                info[name] ={
                            'name':'%s'%name,
                            'slary':'%s'%slary,
                            'other':''
                        }
#定义写操作函数
def write(name,slary):
    with open('info.csv', mode='a+', encoding='utf-8') as f_w:
        f_w.write('\n%s %s'%(name,slary))

#定义修改员工信息函数
def replace(old_name,new_name,old_slary,new_slary):
    f_r = open('info.csv',mode='r',encoding='utf-8')
    for line in f_r:
        line = line.strip()
        if old_name in line:
            line = line.replace(old_name,new_name)
            line = line.replace(old_slary,new_slary)
        f_w.write(line + '\n')
    f_r.close()
    f_w.close()

while True:
    get_info()
    ##打印操作菜单
    for key,ops_lists in enumerate(ops):
        print(key,ops_lists,)
    select = input("请选择操作序号:")
    if select.isdigit():
        pass
    else:
        print("请输入数字")
        continue

    if select.startswith('0'):
        input1 = input("请输入员工名字:")
        print("%s的工资是:%s" %(input1,info[input1]['slary']))
        continue

    elif select.startswith('1'):
        input1 = input("请输入修改员工的名字:")
        print("%s现在的信息是:名字:%s,工资:%s"%(input1,info[input1]['name'],info[input1]['slary']))
        input2 = input("名字修改为:")
        input3 = input("工资修改为:")
        replace(input1, input2,info[input1]['slary'], input3)
        os.remove('info.csv')
        # os.rename('info1.csv','info.csv')
        print("员工信息修改成功")
        get_info()
        continue

    elif select.startswith('2'):
        input1 = input("请输入增加员工的名字:")
        input2 = input("请输入增加员工的工资:")
        write(input1,input2)
        print("新增员工信息成功")
        get_info()
        continue
    elif select.startswith('3'):
        input1 = input("请输入删除员工的名字:")
        with open("info.csv","r",encoding="utf-8")as f:
            lines=f.readlines()
            print(lines)
            with open("info.csv", "w", encoding="utf-8")as f_w:
                for line in lines:
                    if"input"in line:
                        get_info()
        continue
    elif select.startswith('4'):
        import pandas as pd

        data = pd.read_csv('info.csv')
        print(
            data)
        get_info()
        continue
    elif select.startswith('6'):
        print("退出成功")
        sys.exit(1)

运行结果及报错内容

更改csv内容后显示超出范围什么的

我的解答思路和尝试过的方法

把csv文件清空内容后重新加就可以了

我想要达到的结果

因为用代码添加的没有表头,也不是一个格子一个数据,所以想问问大家,这个需要怎么实现 或者怎么才能直接更换csv文件不报错 csv文件名:info.csv

这个是我百度到的代码,加了加东西,但是就是实现不了要的效果,另外,想删除一行的时候却是把整个内容都删除了,有人可以解答一下吗

  • 写回答

1条回答 默认 最新

  • 关注

    你单独编辑csv文件后格式与程序规定的格式不一样,当然运行不成功了
    你希望你csv文件格式是什么样子的?

    你题目的解答代码如下:

    import csv
    
    import sys,os
    #定义操作列表
    ops = ['查询员工工资','修改员工工资','增加新员工记录','删除员工信息','查看全部员工信息','汇总统计','退出']
    info = {}
    def get_info():
       #读取文件得到员工信息
        global info
        try:
            with open("info.csv","r",newline="", encoding='utf-8') as fileObj:
                li = list(csv.reader(fileObj))
            for name, slary in li[1:]:
                info[name] ={
                    'name':name,
                    'slary':slary,
                    'other':''
                }
        except IOError:
            info = {}
    
    #定义写操作函数
    def write_info():
        with open("info.csv","w",newline="", encoding='utf-8') as fileObj:
            csv.writer(fileObj).writerow(["名字","工资"])
            for k,v in info.items():
                csv.writer(fileObj).writerow([v["name"],v["slary"]])
    
    
    
    get_info()
    while True:
        ##打印操作菜单
        for key,ops_lists in enumerate(ops):
            print(key,ops_lists,)
        select = input("请选择操作序号:")
        if select.isdigit():
            pass
        else:
            print("请输入数字")
            continue
    
        if select.startswith('0'):
            input1 = input("请输入员工名字:")
            if input1 not in info:
                print(input1,"不存在")
                continue
            print("%s的工资是:%s" %(input1,info[input1]['slary']))
            continue
    
        elif select.startswith('1'):
            input1 = input("请输入修改员工的名字:")
            if input1 not in info:
                print(input1,"不存在")
                continue
            print("%s现在的信息是:名字:%s,工资:%s"%(input1,info[input1]['name'],info[input1]['slary']))
            input2 = input("名字修改为:")
            input3 = input("工资修改为:")
            del info[input1]
            info[input2] ={
                'name':input2,
                'slary':input3,
                'other':''
            }
            print("员工信息修改成功")
            continue
    
        elif select.startswith('2'):
            input1 = input("请输入增加员工的名字:")
            input2 = input("请输入增加员工的工资:")
            info[input1] ={
                'name':input1,
                'slary':input2,
                'other':''
            }
            print("新增员工信息成功")
            continue
        elif select.startswith('3'):
            input1 = input("请输入删除员工的名字:")
            if input1 not in info:
                print(input1,"不存在")
                continue
            del info[input1]
            continue
        elif select.startswith('4'):
            print(f'名字           工资')
            for k,v in info.items():
                print('{:15}{}'.format(v["name"],v["slary"]))
            continue
        elif select.startswith('5'):
            print('人数:',len(info))
            print('共发工资:',sum([int(x['slary']) for x in info.values()]))
            continue
        elif select.startswith('6'):
            write_info()
            print("退出成功")
            sys.exit(1)
    

    如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月19日
  • 已采纳回答 1月19日
  • 创建了问题 1月18日

悬赏问题

  • ¥20 如何通过代码传输视频到亚马逊平台
  • ¥15 php查询mysql数据库并显示至下拉列表中
  • ¥15 freertos下使用外部中断失效
  • ¥15 输入的char字符转为int类型,不是对应的ascall码,如何才能使之转换为对应ascall码?或者使输入的char字符可以正常与其他字符比较?
  • ¥15 devserver配置完 启动服务 无法访问static上的资源
  • ¥15 解决websocket跟c#客户端通信
  • ¥30 Python调用dll文件输出Nan重置dll状态
  • ¥15 浮动div的高度控制问题。
  • ¥66 换电脑后应用程序报错
  • ¥50 array数据同步问题