在python/pyq中高效地编辑csv文件的某些记录

2024-04-26 05:14:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大的csv文件要编辑(数万行),任务是编辑它'友好'和快速, 所以我想用PyQt的QTableView来保存它,还需要一些过滤器,基本上我需要做一些“update price=200 where name='Jack'”操作

我已经想出了一些选择,但不知道我们是否可以将优势结合起来

更新:代码在工作站上,不能接触互联网,我会写的 请改为psudo代码,抱歉

1、导入本地sqlite

它到磁盘的时间超过一分钟,内存少于10秒,使用QSqlTableModel,速度相对较快,添加过滤器也很容易,直到滚动输出才会完全显示出来,这很好

# use pyqt and sqlite
fh = open("path/to/csv/file")    
query = QSqlQuery()
query.prepare("""insert into table""")
for line in fh:
  id, name, price = line.split(",")
  query.bindValue()
  query.exec()

self.view = QTableView()
self.model = QSqlTableModel()
self.model.setTable(table)
self.view.setModel(self.model)
# some line edit gather pattern input
self.model.setFilter("id = 1003")

2,只需将csv解析为模型和显示,我引用了 pyqt - populating QTableWidget with csv data回答用户1006989

把cell放到QStandardItem中,模型/视图运行良好,但是加载大文件太慢(这里大约20秒),而且不知道如何实现过滤器(如果加载到模型中时跳过,我如何写回数据)

3,命令行替换

我已经实现了选项1和选项2,这不是很快,但可能是可以接受的,这里我想知道编写一个类似Perl的regex替换是否有帮助(我们需要先看看它的原始值)

拟定工作流程为

regex search==A>;在表/模型中显示/填充==B>;accept edit==C>; 准备正则表达式替换

^{pr2}$

它提出了一个解决方案,我不必将全部内容加载到数据库或填充到widget中,这应该更快,同时还配备了过滤器, 但我在==C>

如果filter gots 4记录,我编辑其中一个,只需备份过滤器结果,然后diff,然后准备一个整行的序言?(每行都是唯一的,里面有一些主键,不会改变)

希望有人能回顾一下我的想法或者给我一些建议

非常感谢您抽出时间:)


Tags: 文件csv代码name模型gtself编辑
1条回答
网友
1楼 · 发布于 2024-04-26 05:14:45

最后我做了第三种方法,但是'grep files into a small result'也是在python中做的,因为它是windows

# use regex to simulate grep
# write to a new smaller file
# populate into table widget model    
# save changed model back into file

# compare two files, when mismatch found, write the orignal large file once
# but only one line changed, there seems have to be 
#  m ( orginal lines ) * n ( changed lines ) loop
# accumulate changes until done

它的速度更快,grep不到1秒,每更改一行就剩2秒,仍然没有一个好的方法在文件中进行多次替换

这意味着在当前版本中,如果

^{pr2}$

我必须循环整个大文件为B>;B1,即使只有一个匹配项,然后D1和E1,应该有一个更复杂的regex替换

相关问题 更多 >