如何在Cinema4D中使用Python读取大量csv文件?

2024-10-02 06:21:57 发布

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

我有一堆csv文件,其中每列包含一个值,代表Canadarm2的7个分段的角度。最大的文件包含5小时任务的每秒30兆的值!在

我在下面的C4D脚本管理器中编写了这个python脚本,它从csv读取数据,并每秒创建关键帧,其中分段根据角度数据旋转。在

这个脚本在大小不超过1兆字节的小文件上运行得很好,但是当我尝试处理较大的文件时,我会收到可怕的“Cinema4D已停止响应”警报,或者它只是静静地坐在那里,显然什么也没有发生。在

有人有过类似的经历吗?记忆比我的12场演唱会有用吗?如果我能在C4D里一次处理30分钟的数据,我就赢了。在

memLog=''
record = 0
frame=0
path='/Users/...'
filename = path + '30minutes_3meg.csv'
fileobj = open(filename, 'r')

rowcount=0    
for row in fileobj:
    rowcount=rowcount+1
    if rowcount>1:
        ar = row.split(',')
        colcount=0
        for angle in ar:
            if colcount == 0:
                log=angle
                if log==memLog:
                    record=0
                else:
                    record=1
                    print log
                    frame=frame+1

                memLog=log

            if colcount == 2:
                if record==1:
                    rotate(frame,'SR','r',angle)
            elif colcount == 4:
                 if record==1:
                    rotate(frame,'SY','r',angle)
            elif colcount == 6:
                 if record==1:
                    rotate(frame,'SP','r',angle)
            elif colcount == 8:
                if record==1:
                    rotate(frame,'EP','h',angle)  
            elif colcount == 10:
                if record==1:
                    rotate(frame,'WP','h',angle)  
            elif colcount == 12:
                if record==1:
                    rotate(frame,'WY','h',angle)  
            elif colcount == 14:
                if record==1:
                    rotate(frame,'WR','h',angle)  

            colcount=colcount+1

Tags: 文件csv脚本logifrecordframe角度
2条回答

首先,使用文件打开器进行解析的最简单方法是with

with open(filename, 'r') as fileobj:

接下来,Python有一个csv (called csv)的本机库:

因此,要把它放在一起(改编自上面的链接和mgilson):

^{pr2}$

旁注:如果你发现你经常这样做,我可以建议你pandas?它将简化过程,并且可以处理大量数据。在


Python有一个^{} module,这可能会使事情更简单。在

如果您遇到内存问题,我建议您进行强制垃圾回收。您执行import gc,然后在循环中,gc.collect()。它可能不是每个循环都需要的,如果执行得太频繁,甚至会减慢速度。您可以保留一个计数器变量(rowcount可以这样做)并减少执行频率(比如每10000个循环一次)。实验)。考虑添加一个print语句来指示正在发生的集合和行号。这样您就可以判断脚本是否仍在运行或是否已锁定。在

if rowcount % 10000 == 0:
    print 'collecting', rowcount
    gc.collect()

如果可以安装外部Python模块,也可以尝试使用Pandas to load the csv file。对于非常大的文件,它的性能可能更好,但是如果内存仍然不足,则可能需要指定chunksize。在

相关问题 更多 >

    热门问题