Python 查找值是否等于或介于二维数组中的值之间

Python 查找值是否等于或介于二维数组中的值之间,python,arrays,csv,multidimensional-array,Python,Arrays,Csv,Multidimensional Array,我有一个python脚本,它捕获日志数据并将其转换为2D数组 脚本的下一部分旨在循环通过.csv文件,计算每行的第一列,并确定该值是否等于或介于2D数组中的值之间。如果是,则将最后一列标记为TRUE。如果不是,则将其标记为FALSE 例如,如果我的二维阵列如下所示: [[1542053213, 1542053300], [1542055000, 1542060105]] 我的csv文件如下所示: 1542053220, Foo, Foo, Foo 1542060110, Foo, Foo, F

我有一个python脚本,它捕获日志数据并将其转换为2D数组

脚本的下一部分旨在循环通过.csv文件,计算每行的第一列,并确定该值是否等于或介于2D数组中的值之间。如果是,则将最后一列标记为TRUE。如果不是,则将其标记为FALSE

例如,如果我的二维阵列如下所示:

[[1542053213, 1542053300], [1542055000, 1542060105]]
我的csv文件如下所示:

1542053220, Foo, Foo, Foo
1542060110, Foo, Foo, Foo
第一行的最后一列应为TRUE(或1),而第二行的最后一列应为FALSE(或0)

我当前的代码如下所示:

from os.path import expanduser
import re
import csv
import codecs

#Setting variables
#Specifically, set the file path to the reveal log
filepath = expanduser('~/LogAutomation/programlog.txt')
csv_filepath = expanduser('~/LogAutomation/values.csv')
tempStart = ''
tempEnd = ''

print("Starting Script")

#open the log
with open(filepath) as myFile:
    #read the log
    all_logs = myFile.read()
myFile.close()

#Create regular expressions
starting_regex = re.compile(r'\[(\d+)\s+s\]\s+Starting\s+Program')
ending_regex = re.compile(r'\[(\d+)\s+s\]\s+Ending\s+Program\.\s+Stopping')

#Create arrays of start and end times
start_times = list(map(int, starting_regex.findall(all_logs)))
end_times = list(map(int, ending_regex.findall(all_logs)))

#Create 2d Array
timeArray = list(map(list, zip(start_times, end_times)))

#Print 2d Array
print(timeArray)

print("Completed timeArray construction")

#prints the csv file
with open(csv_filepath, 'rb') as csvfile:
    reader = csv.reader(codecs.iterdecode(csvfile, 'utf-8'))

    for row in reader:
        currVal = row[0]
            #if currVal is equal to or in one of the units in timeArray, mark last column as true
            #else, mark last column as false

csvfile.close()

print("Script completed")
我已经成功地遍历了我的.csv,并为每一行获取了第一列的值,但我不知道如何进行比较。不幸的是,我不熟悉2D数组数据结构,无法在值之间进行检入。此外,我的.csv文件中的列数可能会波动,因此是否有人知道一种非静态的方法来确定“最后一列”,以便能够在文件中的列数之后写入该列


有人能为我提供一些帮助吗?

您只需遍历列表列表,检查值是否在任何间隔内。下面是一个简单的方法:

with open(csv_filepath, 'rb') as csvfile:
    reader = csv.reader(codecs.iterdecode(csvfile, 'utf-8'))
    input_rows = [row for row in reader]

with open(csv_filepath, 'w') as outputfile:
    writer = csv.writer(outputfile)

    for row in input_rows:
        currVal = int(row[0])
        ok = 'FALSE'

        for interval in timeArray:
            if interval[0] <= curVal <= interval[1]:
                ok = 'TRUE'
                break

        writer.writerow(row + [ok])
打开(csv_文件路径,'rb')作为csvfile:
reader=csv.reader(codecs.iterdecode(csvfile,'utf-8'))
input_rows=[读卡器中的行对行]
将打开的(csv_文件路径,'w')作为输出文件:
writer=csv.writer(输出文件)
对于输入_行中的行:
currVal=int(第[0]行)
ok='FALSE'
对于时间数组中的间隔:

如果interval[0]您只需要迭代列表并检查该值是否在任何间隔中。下面是一个简单的方法:

with open(csv_filepath, 'rb') as csvfile:
    reader = csv.reader(codecs.iterdecode(csvfile, 'utf-8'))
    input_rows = [row for row in reader]

with open(csv_filepath, 'w') as outputfile:
    writer = csv.writer(outputfile)

    for row in input_rows:
        currVal = int(row[0])
        ok = 'FALSE'

        for interval in timeArray:
            if interval[0] <= curVal <= interval[1]:
                ok = 'TRUE'
                break

        writer.writerow(row + [ok])
打开(csv_文件路径,'rb')作为csvfile:
reader=csv.reader(codecs.iterdecode(csvfile,'utf-8'))
input_rows=[读卡器中的行对行]
将打开的(csv_文件路径,'w')作为输出文件:
writer=csv.writer(输出文件)
对于输入_行中的行:
currVal=int(第[0]行)
ok='FALSE'
对于时间数组中的间隔:

如果间隔[0],我会选择更像蟒蛇的东西

compare = lambda x, y, t: (x <= int(t) <= y)
with open('output.csv', 'w') as outputfile:
    writer = csv.writer(outputfile)
    with open(csv_filepath, 'rb') as csvfile:
        reader = csv.reader(codecs.iterdecode(csvfile, 'utf-8'))

    for row in reader:
        currVal = row[0]
        #if currVal is equal to or in one of the units in timeArray, mark last column as true
        #else, mark last column as false
        match = any(compare(x, y, currVal) for x, y in timeArray)
        write.writerow(row + ['TRUE' if match else 'FALSE'])

    csvfile.close()
outputfile.close()

我要找一个更像蟒蛇的东西

compare = lambda x, y, t: (x <= int(t) <= y)
with open('output.csv', 'w') as outputfile:
    writer = csv.writer(outputfile)
    with open(csv_filepath, 'rb') as csvfile:
        reader = csv.reader(codecs.iterdecode(csvfile, 'utf-8'))

    for row in reader:
        currVal = row[0]
        #if currVal is equal to or in one of the units in timeArray, mark last column as true
        #else, mark last column as false
        match = any(compare(x, y, currVal) for x, y in timeArray)
        write.writerow(row + ['TRUE' if match else 'FALSE'])

    csvfile.close()
outputfile.close()

比较=λx,y,t:(x我不理解预期的输出。是否要将TRUE/FALSE作为2D数组中行的最后一个元素?将TRUE/FALSE添加到2D数组中的行?或添加到csv行?在这种情况下,结果保存在何处?同一个文件?很抱歉,您不理解。写入的目标是写入.csv文件的最后一列(在示例代码中,values.csv)如果第一列的值等于2D数组中的值或介于2D数组中的值之间,则使用TRUE。如果不是,则在最后一列中写入FALSE。我不理解预期的输出。是否要将TRUE/FALSE作为2D数组中行的最后一个元素?将TRUE/FALSE添加到2D数组中的行?或添加到csv行?在这种情况下,保存t到何处结果是?相同的文件?很抱歉,您不明白。编写的目标是写入.csv文件的最后一列(在示例代码中,为values.csv)如果第一列的值等于或介于2D数组中的值之间,则使用TRUE。如果不是,则在最后一列中使用FALSE。您好@Marco Bonelli,非常感谢您的回复。请给我一点时间(可能30分钟)要与我的代码集成和测试,我会马上回复你。你能解释一下TimeArray中的
间隔吗?@JerryM。当然:就像你对reader中的行所做的
一样,你可以使用
for…in…
语法来迭代任何列表(或一般的iterable对象)。您的
timeArray
是一个列表列表,因此您可以使用
for interval在timeArray
中对其进行迭代。一旦进入
for
内,
interval
变量将保存正在处理的当前元素的值,因此在您的情况下,它将首先是
[1542053213,1542053300]
,然后是
[1542055000, 1542060105]
。你好,Marco。运行此代码最终会删除我的.csv文件中的值。我需要写入我正在打开的同一个csv文件。希望这会有所帮助。我感谢您的回复。@JerryM。我假设您希望结果出现在另一个文件中。我更改了代码,现在这些更改直接在同一个文件上进行。看看这是否对您有效。另外,“将最后一列标记为真或假”是指要替换最后一列中的值还是要在最后一列后添加新列?我想添加一列,很抱歉不清楚。您好@Marco Bonelli,非常感谢您的回复。请给我一点时间(可能30分钟)要与我的代码集成和测试,我会马上回复你。你能解释一下TimeArray中的
间隔吗?@JerryM。当然:就像你对reader中的行所做的
一样,你可以使用
for…in…
语法来迭代任何列表(或一般的iterable对象)。您的
timeArray
是一个列表列表,因此您可以使用
for interval在timeArray
中对其进行迭代。一旦进入
for
内,
interval
变量将保存正在处理的当前元素的值,因此在您的情况下,它将首先是
[1542053213,1542053300]
,然后是
[1542055000, 1542060105]
。你好,Marco。运行此代码最终会删除我的.csv文件中的值。我需要写入我正在打开的同一个csv文件。希望这会有所帮助。我感谢您的回复。@JerryM。我假设您希望结果出现在另一个文件中。我更改了代码,现在这些更改直接在同一个文件上进行。看看这是否对您有效。另外,“将最后一列标记为TRUE或FALSE”是指要替换最后一列中的值还是要在最后一列之后添加新列?我会这样做