Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 优化或加速从.xy文件到excel的读取_Python_Excel_File_Batch File - Fatal编程技术网

Python 优化或加速从.xy文件到excel的读取

Python 优化或加速从.xy文件到excel的读取,python,excel,file,batch-file,Python,Excel,File,Batch File,我有几个.xy文件(2列,x和y值)。我一直在尝试读取所有这些文件,并将“y”值粘贴到单个excel文件中(“x”值在所有这些文件中都是相同的)。到目前为止,我的代码一个接一个地读取文件,但速度非常慢(每个文件大约需要20秒)。我有相当多的.xy文件,时间加起来相当多。到目前为止,我的代码是: import os,fnmatch,linecache,csv from openpyxl import Workbook wb = Workbook() ws = wb.worksheets[0]

我有几个.xy文件(2列,x和y值)。我一直在尝试读取所有这些文件,并将“y”值粘贴到单个excel文件中(“x”值在所有这些文件中都是相同的)。到目前为止,我的代码一个接一个地读取文件,但速度非常慢(每个文件大约需要20秒)。我有相当多的.xy文件,时间加起来相当多。到目前为止,我的代码是:

import os,fnmatch,linecache,csv
from openpyxl import Workbook

wb = Workbook() 
ws = wb.worksheets[0]
ws.title = "Sheet1"


def batch_processing(file_name):
    row_count = sum(1 for row in csv.reader(open(file_name)))
    try:
        for row in xrange(1,row_count):

            data = linecache.getline(file_name, row)
            print data.strip().split()[1]   
            print data
            ws.cell("A"+str(row)).value = float(data.strip().split()[0])
            ws.cell("B"+str(row)).value = float(data.strip().split()[1])

        print file_name
        wb.save(filename = os.path.splitext(file_name)[0]+".xlsx")
    except IndexError:
        pass


workingdir = "C:\Users\Mine\Desktop\P22_PC"
os.chdir(workingdir)
for root, dirnames, filenames in os.walk(workingdir):
    for file_name in fnmatch.filter(filenames, "*_Cs.xy"):
        batch_processing(file_name)

感谢您的帮助。谢谢。

我认为您的主要问题是,您正在编写Excel并保存文件中的每一行,以及目录中的每一个文件。我不确定实际将值写入Excel需要多长时间,但只要将
保存
移出循环,并且只在添加完所有内容后保存,就可以节省一点时间。还有,这些文件有多大?如果它们很大,那么
linecache
可能是一个好主意,但如果它们不是太大,那么您可能不需要它

def批处理(文件名):
#使用“with”是一种更好的打开文件的方法,它可以确保文件
#当您离开代码块时,正确关闭等
将open(filename,'rb')作为f:
读卡器=csv。读卡器(f)
#行计数=总和(csv.reader中的行为1(打开(文件名)))
#^^^^实际上根本不需要这样做(尽管它很聪明:)
#您现在正在使用它来管理循环,但更具python风格的方法是
#按如下方式做
对于第_行,枚举(读卡器)中的第行:
#拆分该行并创建两个变量,用于保存val1和val2
val1,val2=直线
打印val1,val2#您也可以删除此选项-打印也需要时间
ws.cell(“A”+str(第1行)).value=float(val1)
ws.cell(“B”+str(第1行)).value=float(val2)
#在此处执行此操作将在处理整个文件后保存该文件。
#您可以节省更多的时间,并在您的步行声明之后将此移动到-
#这样,您只需在完成所有操作后保存一次
wb.save(文件名=os.path.splitext(文件名)[0]+“.xlsx”)

我不确定
linecache
是如何工作的-它会使用
总和中以前打开和关闭的文件名中的数据吗?或者它只打开文件一次,或者每一行它都必须再次打开文件?在你回复之前,我更新了一些代码,我完全按照你说的做了。在walk语句之后将保存移动到。我想这里的基本问题是这些过程中哪一个更快:linecache还是使用csv.reader。我将尝试csv.reader并回复您。再次感谢。@groovyrv没问题。我并没有真正使用过
linecache
,但从我所知道的来看,主要的好处来自多次访问文件(因此是缓存部分,我可能完全错了)。模块的源代码是,有趣的是,在第127行,您可以看到,为了获取信息,实际上打开了文件并使用了
readlines()
。我相信这支持多访问点——当您需要从同一个(缓存的)文件中重复访问行时,您开始看到好处。