Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.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文件的行,以在另一个csv文件中查找相应的数据_Python_Csv - Fatal编程技术网

Python 循环浏览一个csv文件的行,以在另一个csv文件中查找相应的数据

Python 循环浏览一个csv文件的行,以在另一个csv文件中查找相应的数据,python,csv,Python,Csv,我有一个有趣的问题: file1.csv有几百行,如: Code,DTime 1,2010-12-26 17:01 2,2010-12-26 17:07 2,2010-12-26 17:15 id,D,Sym,DateTime,Bid,Ask 1375022797,D,USD,2010-12-26 17:00:15,1.311400,1.311700 1375022965,D,USD,2010-12-26 17:00:56,1.311200,1.311500 1375022984,D,USD,

我有一个有趣的问题:

file1.csv有几百行,如:

Code,DTime
1,2010-12-26 17:01
2,2010-12-26 17:07
2,2010-12-26 17:15
id,D,Sym,DateTime,Bid,Ask
1375022797,D,USD,2010-12-26 17:00:15,1.311400,1.311700
1375022965,D,USD,2010-12-26 17:00:56,1.311200,1.311500
1375022984,D,USD,2010-12-26 17:00:56,1.311300,1.311600
1375023013,D,USD,2010-12-26 17:01:01,1.311200,1.311500
1375023039,D,USD,2010-12-26 17:01:02,1.311100,1.311400
1375023055,D,USD,2010-12-26 17:01:03,1.311200,1.311500
1375023063,D,USD,2010-12-26 17:01:03,1.311300,1.311600
file2.csv大约有1100万行,如:

Code,DTime
1,2010-12-26 17:01
2,2010-12-26 17:07
2,2010-12-26 17:15
id,D,Sym,DateTime,Bid,Ask
1375022797,D,USD,2010-12-26 17:00:15,1.311400,1.311700
1375022965,D,USD,2010-12-26 17:00:56,1.311200,1.311500
1375022984,D,USD,2010-12-26 17:00:56,1.311300,1.311600
1375023013,D,USD,2010-12-26 17:01:01,1.311200,1.311500
1375023039,D,USD,2010-12-26 17:01:02,1.311100,1.311400
1375023055,D,USD,2010-12-26 17:01:03,1.311200,1.311500
1375023063,D,USD,2010-12-26 17:01:03,1.311300,1.311600
我要做的是编写一个脚本,获取file1.csv中的每个DTime值,并在file2.csv的DateTime列中找到部分匹配的第一个实例,然后输出DateTime、Bid、Ask以获取该行。部分匹配在前16个字符上

这两个文件都是从最早到最新排序的,因此如果file1.csv中的“2010-12-26 17:01”与file2.csv中的4个条目相匹配,我只需要提取第一个条目:“2010-12-26 17:01:01”

我不知道该怎么办。。我试过查字典,但值的顺序很重要,所以我不确定这是否有效。可能会将file1的DTime列放入一个列表,并为该列表中的每个条目在file2中搜索DateTime


谢谢大家

您可以从文件2创建字典,其中键是所需时间的前缀,值为第一行或与此前缀匹配的所有行。 那么,这只是做一些事情的问题,比如:

entries = file2Dict.get(file1Entry)
if entries:
   print  "First entry is %s" entries[0]

如果您没有重复的
DTime
值,则应该可以:

import csv

file1reader = csv.reader(open("file1.csv"), delimiter=",")
file2reader = csv.reader(open("file2.csv"), delimiter=",")

header1 = file1reader.next() #header
header2 = file2reader.next() #header

for Code, DTime in file1reader:
    for id_, D, Sym, DateTime, Bid, Ask in file2reader:
        if DateTime.startswith(DTime): # found it
            print DateTime, Bid, Ask   # output data
            break                      # break and continue where we left next time
编辑

import csv
from datetime import datetime

file1reader = csv.reader(open("file1.csv"), delimiter=",")
file2reader = csv.reader(open("file2.csv"), delimiter=",")

header1 = file1reader.next() #header
header2 = file2reader.next() #header

for Code, DTime in file1reader:
    DTime = datetime.strptime(DTime, "%Y-%m-%d %H:%M")
    for id_, D, Sym, DateTime, Bid, Ask in file2reader:
        DateTime = datetime.strptime(DateTime, "%Y-%m-%d %H:%M:%S")
        if DateTime>=DTime: # found it
            print DateTime, Bid, Ask   # output data
            break                      # break and continue where we left next time

除非您只需要这样做一次,否则您应该真正使用数据库。在table2中添加一列,该列包含DATETIME而不包含秒数,这样您就可以在完全匹配的情况下加入,而不是使用LIKE

它会很快,如果你为这些列建立索引,速度会更快。如果您也可以在数据库中存储file1.csv,则不需要迭代:您可以在一个select查询中获得整个结果集。这就是SQL的用武之地


注:如果您决定采用这种方法,您可以寻求查询方面的帮助。

如果您将问题放入数据库并进行连接,那么问题就不那么有趣了;)我在access和mysql中尝试了一种数据库方法,但在尝试左键连接这两个表时遇到了问题。唯一快速运行的sql查询是从tblTicks WHERE(DateTime)中选择排名前1的DateTime、Bid、Ask,如“2010-12-26 17:01*”;当我尝试对第一个表进行任何迭代时,它冻结了。。虽然python会处理得更好一些,但是使用通配符进行字符串搜索肯定会很慢。我建议在您有时间和资源正确迁移时使用数据库方法。在选择索引时考虑这些类型的慢查询,这几乎起作用了!它实际上发现我在文件2中的数据有问题。在寻找“2010-01-06 20:00”时,它没有找到它。。相反,文件2中的邻近值是“2010-01-06 19:59:20”和“2010-01-06 20:01:14”-理想情况下,我将选择序列中的下一个值,即20:01:14。这里是否需要“datetime”类?能否验证是否需要将
if datetime.startswith(DTime):
更改为
if datetime>=DTime:
这似乎确实可以。尝试了这两种方法:>=和datetime都很好地工作了!非常感谢你的帮助@用户1249464:啊,对<代码>>=不带日期时间也可以,因为日期格式是可排序的。我想我会对结果数据做更多的工作。我应该使用id作为键将其加载到字典中吗?我想我只需要更换打印行,对吗?