Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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 3.x Python3读写csv文件并使用dict打印行_Python 3.x_Csv - Fatal编程技术网

Python 3.x Python3读写csv文件并使用dict打印行

Python 3.x Python3读写csv文件并使用dict打印行,python-3.x,csv,Python 3.x,Csv,我正在阅读巨大的csv文件,最后一行是日期和时间。 我写了下面的代码,寻找增强或优化的解决方案 以下是我的数据: 2067458,XXXXXXXXXXXXX,1006386100.79.94.1,XXXX4,1,0,0,1,0,1,“XXXXX”,现场,“未知”,未知,未知,未知,未知,路由器没有无线电, 未知,未知,未知,未知,未知,2017-01-2416:03:43, , 这是我的密码 import csv import datetime import re input_file = '

我正在阅读巨大的csv文件,最后一行是日期和时间。 我写了下面的代码,寻找增强或优化的解决方案

以下是我的数据:

2067458,XXXXXXXXXXXXX,1006386100.79.94.1,XXXX4,1,0,0,1,0,1,“XXXXX”,现场,“未知”,未知,未知,未知,未知,路由器没有无线电, 未知,未知,未知,未知,未知,2017-01-2416:03:43, ,

这是我的密码

import csv
import datetime
import re

input_file = 'input22.csv'
output_file= 'temp.csv'

def main():
    with open(input_file,"r") as fileHandle:
         CSVreader = fileHandle.readlines()
         fileHandle.close()
         reader  = CSVreader[-1]

    with open ('temp.csv',"w") as fileHandle:
         fileHandle.write(reader)
         fileHandle.close()

    with open('temp.csv') as temp_file:
         readCSV = csv.reader(temp_file, delimiter=',')
         for row in readCSV:
             Date=(row[22])
             Time=(row[23])
             D=Date.strip()
             T=Time.strip()
             print ("{} {}".format(D,T))


main()

我在代码中立即看到了一些问题——使用
with
块打开文件时,无需关闭文件。使用上下文的全部意义在于,一旦离开块,文件就被关闭

Eg

应该是,

with open ('temp.csv',"w") as fileHandle:
     fileHandle.write(reader)
就这样!Python为您处理关闭文件的操作

接下来,不要使用
fh.readlines()
。这会将整个文件读入内存,如果文件太大而无法放入内存,可能会导致计算机崩溃。相反在这种情况下,这看起来像

with open(input_file, "r") as fileHandle:
     CSVreader = csv.reader(fileHandle)
     for row in CSVreader:
         # do something with the row
Python将自动缓冲您的读取,并且一次只在内存中保留文件的一小部分。旁注:按照您目前的方式,您正在将整个文件读入
CSVreader
,它实际上应该被称为
rows
或其他什么,因为这不是
读取器
对象

最后,无需在第一个实例中将模式传递给
open()
调用——您可以使用第二次打开
temp.csv
时使用的相同语法

我相信这个(未经测试的)代码片段与您的代码片段实现了相同的功能,更加简洁高效

import csv
import datetime
import re

input_file = 'input22.csv'
output_file= 'temp.csv'

def main():
    last = list()  # scope this variable so that we may use it after the files have been closed
    with open(input_file) as input_fh, \
            open('temp.csv', 'w') as output_fh:
        reader = csv.reader(input_fh)
        writer = csv.writer(output_fh)
        # discard everything except the last line of output
        for row in reader:
            last = row
        writer.write(last)

    # print that last row with formatting
    D=last[22].strip()
    T=last[23].strip()
    print ("{} {}".format(D,T))

main()

您可以使用
pandas
在一行中直接读取csv并将任何列输出。您试图完成什么?感谢您的代码,您提出了我的主要问题,即在一个变量中缓冲完整的行。以下代码适用于writer.writerows(last)。
import csv
import datetime
import re

input_file = 'input22.csv'
output_file= 'temp.csv'

def main():
    last = list()  # scope this variable so that we may use it after the files have been closed
    with open(input_file) as input_fh, \
            open('temp.csv', 'w') as output_fh:
        reader = csv.reader(input_fh)
        writer = csv.writer(output_fh)
        # discard everything except the last line of output
        for row in reader:
            last = row
        writer.write(last)

    # print that last row with formatting
    D=last[22].strip()
    T=last[23].strip()
    print ("{} {}".format(D,T))

main()