V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ShuoHui
V2EX  ›  Python

Python 操作 csv,这种情况这么打断点判断错在哪里?

  •  
  •   ShuoHui · 2020-04-17 08:45:14 +08:00 · 2023 次点击
    这是一个创建于 1468 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求:

    • 从某个 csv 表格提取需要的数据,写入 xlsx
    • 如果第 11 列的单元格包含“xxx”字段,则删除该行

    开始的时候,我是这样:

    dir = (r'C:\\Users\\ShuoHui\\Desktop\\data\\')
    workbook = open(dir + 'filename.csv')
    workbookReader = csv.reader(workbook)
    workbookData = list(workbookReader)
    
    nRows = workbookReader.line_num
    rowsNum = 1  # 行号
    for rowsNum in range(1, nRows):
        if workbookData[rowsNum][10] != 'xxx':
            outsheet.write(rowsNum, 0, workbookData[rowsNum][4])
            outsheet.write(rowsNum, 1, workbookData[rowsNum][10])
            outsheet.write(rowsNum, 4, workbookData[rowsNum][9])
            outsheet.write(rowsNum, 5, workbookData[rowsNum][2])
            outsheet.write(rowsNum, 9, workbookData[rowsNum][0])
        else:
            continue
    outworkbook.save(dir + "out\\filename.xlsx")
    

    上面这种情况,可以输出想要的,但是会有空白行,于是我想说,加入一个 i 控制写入时候的行号,就是这样:

    dir = (r'C:\\Users\\ShuoHui\\Desktop\\data\\')
    workbook = open(dir + 'filename.csv')
    workbookReader = csv.reader(workbook)
    workbookData = list(workbookReader)
    
    nRows = workbookReader.line_num
    rowsNum = 1  # 行号
    for rowsNum in range(1, nRows):
        i = 1 #从第 2 行开始写入
        if workbookData[rowsNum][10] != 'xxx':
            outsheet.write(i, 0, workbookData[rowsNum][4])
            outsheet.write(i, 1, workbookData[rowsNum][10])
            outsheet.write(i, 4, workbookData[rowsNum][9])
            outsheet.write(i, 5, workbookData[rowsNum][2])
            outsheet.write(i, 9, workbookData[rowsNum][0])
            i += 1
        else:
            continue
    outworkbook.save(dir + "out\\filename.xlsx")
    

    但是这样子,只会输出最后一行有效数据。 问题 1:以后我遇到这样循环的问题,怎么打断点排错(pycharm) 问题 2:我这个问题出在哪里。。。 ps: *** 小弟基础不好 ***,请各位大神不吝赐教,感谢大家。

    jtr109
        1
    jtr109  
       2020-04-17 08:57:38 +08:00   ❤️ 1
    第二段代码「只会输出一行」是因为:for 循环每次都会执行一遍代码块(缩进部分)中的命令,所以每次循环都会把 i=1 执行一遍,所以一只在同一行反复输入。

    上面一个「空白行」我没有理解是什么意思,如果需要打断点,可以注意 rowsNum 的值是否符合预期。特别是「第一行」应该是 1 还是 0 。
    crella
        2
    crella  
       2020-04-17 09:02:06 +08:00 via Android   ❤️ 1
    错误原因:for 循环内每次循环,i 都被设置为 1

    改进:i 放到 for 循环以前设置 i=1,如果满足什么!= 'xxx',则 outsheet 写入第 i 行,然后循环结束时设置 i+=1
    ShuoHui
        3
    ShuoHui  
    OP
       2020-04-17 09:04:47 +08:00
    @jtr109 我把 i=1 放在 for 外面可以了,感谢回复!
    ShuoHui
        4
    ShuoHui  
    OP
       2020-04-17 09:04:58 +08:00
    @crella 感谢
    yzlnew
        5
    yzlnew  
       2020-04-17 09:08:30 +08:00   ❤️ 1
    如果经常处理这样的数据可以考虑使用 pandas
    dobest
        6
    dobest  
       2020-04-17 09:10:10 +08:00 via iPhone   ❤️ 1
    推荐使用 pandas 进行处理,读入 csv,删除特定行,然后 to_excel 写到 Excel
    ShuoHui
        7
    ShuoHui  
    OP
       2020-04-17 09:11:52 +08:00
    @yzlnew
    @dobest 昨天也了解过 pandas 也在学习中,其他需求可以做,但是删除特定行不会写。也没搜到,所以就先用 csv 做了。感谢提醒。
    SjwNo1
        8
    SjwNo1  
       2020-04-17 09:14:22 +08:00   ❤️ 1
    第一个 outsheet 变量是啥,可以使用类似于 Worksheet.Rows(i).Delete() 的方法
    第二个 循环定义初始变量 i,不过这样能否起效果就不得而知了
    还有:重复变量声明 rowsNum = 1 是? (拙见~
    ShuoHui
        9
    ShuoHui  
    OP
       2020-04-17 09:20:55 +08:00
    @SjwNo1 outsheet 是我要输出的表格,忘记贴上来了。
    还有重复变量声明。。经你们提醒我才发现。
    no1xsyzy
        10
    no1xsyzy  
       2020-04-17 09:27:09 +08:00   ❤️ 1
    python 的 csv 操作始终应打开自 open(..., newline='')
    https://docs.python.org/3/library/csv.html#csv.reader

    看脚注,一来如果内容有换行无法正常操作,二来如果你的平台行尾用的是 \r\n,则会发生空行

    为 v2 的水平感到痛心,深深地感到惋惜
    princelai
        11
    princelai  
       2020-04-17 11:36:08 +08:00   ❤️ 1
    df = pd.read_csv('filename.csv')

    df.query("col11name not in ['xxx']").to_exxcel("out\\filename.xlsx")

    拿去吧
    ShuoHui
        12
    ShuoHui  
    OP
       2020-04-17 11:56:26 +08:00
    @princelai 万分感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1064 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 22:34 · PVG 06:34 · LAX 15:34 · JFK 18:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.