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

2020-04-17 08:45:14 +08:00
 ShuoHui

需求:

开始的时候,我是这样:

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: *** 小弟基础不好 ***,请各位大神不吝赐教,感谢大家。

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

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

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

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

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

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

拿去吧
ShuoHui
2020-04-17 11:56:26 +08:00
@princelai 万分感谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/663284

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX