Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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读取CSV文件的开头和结尾_Python_Csv - Fatal编程技术网

如何用python读取CSV文件的开头和结尾

如何用python读取CSV文件的开头和结尾,python,csv,Python,Csv,我有一个带有时间戳字段的csv文件,其中第一行表示开始时间,最后一行将结束时间指定为时间帧。如何使用python获取它们 CSV文件: run,a,b,2015-10-25T18:02:30.798426Z run,c,d,2015-10-25T18:02:30.807375Z run,e,f,2015-10-25T18:02:30.809113Z run,g,h,2015-10-25T18:02:30.825410Z run,i,j,2015-10-25T18:02:30.843917Z

我有一个带有时间戳字段的csv文件,其中第一行表示开始时间,最后一行将结束时间指定为时间帧。如何使用python获取它们

CSV文件:

run,a,b,2015-10-25T18:02:30.798426Z  
run,c,d,2015-10-25T18:02:30.807375Z
run,e,f,2015-10-25T18:02:30.809113Z
run,g,h,2015-10-25T18:02:30.825410Z
run,i,j,2015-10-25T18:02:30.843917Z
run,k,l,2015-10-25T18:02:30.850492Z
run,m,n,2015-10-25T18:02:30.858041Z
run,o,p,2015-10-25T18:02:30.859345Z
run,q,r,2015-10-25T18:02:30.862365Z

谢谢。

如果您已经知道这些行是按时间排序的,您可以执行以下操作:

import csv
import dateutil.parser

with open('file.csv') as f: 
   reader = csv.reader(f)
   first = dateutil.parser.parse(reader.next()[3])
   for row in reader:
      pass
last = dateutil.parser.parse(row[3])

print('%s - %s' % (first, last))
# OUTPUTS: 
# 2015-10-25T18:02:30.798426Z - 2015-10-25T18:02:30.862365Z
然后,如果您想将第一个和最后一个返回到datetime对象(从isoformat),您可以使用
dateutil.parser
,例如:


上面提供的答案是可行的,但需要读取整个文件。如果您在unix系统上

# assume CSV file like
# a,b,1
# a,b,2
# a,b,3
# ...
# a,b,234934

import subprocess

# get first N lines of CSV file into array
how_many_lines_in_head = '1'
head_args = ['head', '-n', how_many_lines_in_head, 'input.csv']
head_str = subprocess.check_output(head_args)
first_timestamp = head_str.split(',')[-1].replace('\n','')

# do the same for tail end of file
how_many_lines_in_tail = '1'
tail_args = ['tail', '-n', how_many_lines_in_tail, 'input.csv']
tail_str = subprocess.check_output(tail_args)
last_timestamp = tail_str.split(',')[-1].replace('\n','')

# i'm assuming unix system here so line endings are \n

这个怎么样?别忘了你必须先导入csv文件。@lemonhead谢谢。只是csv文件中的一个小更改。如果时间戳行号发生变化怎么办。我已经更新了帖子。不幸的是,CSV格式可以在引用字段中包含换行符。因此,为了达到100%的准确率,您要么实现一个反向行解析器来解决这个问题,要么放弃,按照另一个答案的建议去做,因为
\n
在某些上下文中只是一个记录分隔符。您好。您是对的,不是每个CSV文件都可以与我的代码一起使用。实际上,我的解决方案的关键思想是,您依赖于专门为此目的而构建的unix工具,而不是将整个文件读入python。我还认为,根据最初的问题,答案是100%准确的。最初发布的CSV代码段中没有“\n”字符,因此我的解决方案不会评估这种可能性!另外,解析一行包含3列的CSV文件的想法并不是真正让我们放弃的想法!问题是,您在这里演示了许多csv处理的“不允许”。这根本不能处理带引号的字段(更不用说带有换行符的字段了)。即使我们假设有速度优势,快速得到错误答案也是错误的。在子流程中执行处理会增加流程管理的大量开销;除非
csv
非常庞大,否则您可能无法打败优化的“python”解决方案。例如,如果我们可以忽略嵌入的换行符(但希望正确处理带引号的字段),您可以
mmap
输入文件,正常处理第一行,然后使用
rfind(b“\n”)
要找出最后一行的起始位置,请阅读并处理它(使用适当的
csv
module解析器),这样您就避免了读取文件中不需要的任何部分,避免了所有子流程,并按照真正的csv规则正确解析,而不是“按逗号和希望分割”。完全同意您在这里所说的一切=)。谢谢
# assume CSV file like
# a,b,1
# a,b,2
# a,b,3
# ...
# a,b,234934

import subprocess

# get first N lines of CSV file into array
how_many_lines_in_head = '1'
head_args = ['head', '-n', how_many_lines_in_head, 'input.csv']
head_str = subprocess.check_output(head_args)
first_timestamp = head_str.split(',')[-1].replace('\n','')

# do the same for tail end of file
how_many_lines_in_tail = '1'
tail_args = ['tail', '-n', how_many_lines_in_tail, 'input.csv']
tail_str = subprocess.check_output(tail_args)
last_timestamp = tail_str.split(',')[-1].replace('\n','')

# i'm assuming unix system here so line endings are \n