Python 操作 csv,这种情况这么打断点判断错在哪里? - V2EX
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 2666 次点击
    这是一个创建于 2074 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求:

    • 从某个 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     Solana     902 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 19:00 PVG 03:00 LAX 11:00 JFK 14:00
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86