【问题标题】:need to compare two csv files in python需要在python中比较两个csv文件
【发布时间】:2019-09-11 16:49:51
【问题描述】:

我有两个 csv 格式的文件,想要比较列。我希望列表出现在其他 csv 文件中

import tkinter as tk
import pandas as pd
from tkinter.filedialog import askopenfilename
def latlong_func(filename):
data = pd.read_csv(filename)
data["latlong"] = 'FALSE'
data.loc[(data["FAC_TYPE"] ==9500)|
(data["FAC_TYPE"] ==9501)|
(data["FAC_TYPE"] ==9502)|
(data["FAC_TYPE"] ==9503)|
(data["FAC_TYPE"] ==9504)|
(data["FAC_TYPE"] ==9506)|
(data["FAC_TYPE"] ==9507)|
(data["FAC_TYPE"] ==9508)|
(data["FAC_TYPE"] ==9509)|
(data["FAC_TYPE"] ==9510)|
(data["FAC_TYPE"] ==9511)|
(data["FAC_TYPE"] ==9514)|
(data["FAC_TYPE"] ==9515)|
(data["FAC_TYPE"] ==9516)|
(data["FAC_TYPE"] ==9517)|
(data["FAC_TYPE"] ==9520)|
(data["FAC_TYPE"] ==9521)|
(data["FAC_TYPE"] ==9522)|
(data["FAC_TYPE"] ==9527)|
(data["FAC_TYPE"] ==9529)|
(data["FAC_TYPE"] ==9529)|
(data["FAC_TYPE"] ==9531)|
(data["FAC_TYPE"] ==9536)|
(data["FAC_TYPE"] ==9529)|
(data["FAC_TYPE"] ==9529)|
(data["FAC_TYPE"] ==9529)|
(data["FAC_TYPE"] ==9540)|
(data["FAC_TYPE"] ==9542)|
(data["FAC_TYPE"] ==9544)|
(data["FAC_TYPE"] ==9545)|
(data["FAC_TYPE"] ==9546)|
(data["FAC_TYPE"] ==9547)|
(data["FAC_TYPE"] ==9548)|
(data["FAC_TYPE"] ==9549)|
(data["FAC_TYPE"] ==9550)|
(data["FAC_TYPE"] ==9551)|
(data["FAC_TYPE"] ==9552)|
(data["FAC_TYPE"] ==9553)|
(data["FAC_TYPE"] ==9554)|
(data["FAC_TYPE"] ==9555)|
(data["FAC_TYPE"] ==9556)|
(data["FAC_TYPE"] ==9557)|
(data["FAC_TYPE"] ==9558)|
(data["FAC_TYPE"] ==9559)|
(data["FAC_TYPE"]==9561)|
(data["FAC_TYPE"]==9562)|
(data["FAC_TYPE"] ==9563)|
(data["FAC_TYPE"] ==9564)|
(data["FAC_TYPE"] ==9566)|
(data["FAC_TYPE"] ==9513)|
(data["FAC_TYPE"] ==9569)|
(data["FAC_TYPE"] ==9572)|
(data["FAC_TYPE"] ==9574)|
(data["FAC_TYPE"] ==9575)|
(data["FAC_TYPE"] ==9576)|
(data["FAC_TYPE"] ==9577)|
(data["FAC_TYPE"] ==9578)|
(data["FAC_TYPE"] ==9580)|
(data["FAC_TYPE"] ==9581)|
(data["FAC_TYPE"] ==9584)|
(data["FAC_TYPE"] ==9585)|
(data["FAC_TYPE"] ==9586)|
(data["FAC_TYPE"] ==9990)|
(data["FAC_TYPE"] ==9589), ["latlong"]] ='TRUE'

data.to_csv("C:/Users/patesari/Desktop/python 
work/practice1.csv")

writer = data[data["latlong"]=='TRUE']
writer.to_csv('C:/Users/patesari/Desktop/python 
work/newfile1.csv', index=False)
writer.to_csv('C:/Users/patesari/Desktop/python 
work/outputfiles/latlong1.csv', index=False)
def get_filename():

filename0 = askopenfilename(filetypes =[('Python Files', '*.csv')])
filename1 = askopenfilename(filetypes =[('Python Files', '*.csv')])
if filename:
    lbl['text'] = filename
    latlong_func(filename)
else:
    lbl['text'] = 'not selected'
root = tk.Tk()
root.geometry('200x100')
lbl = tk.Label(root, text='Select filename')
lbl.pack(side='top', pady=10)
btn = tk.Button(root, text='Open', command=get_filename)
btn.pack(side='top', pady=10)
root.mainloop()

在上面我动态获取文件,但我已经硬编码了“或”文件。我想将它与存在列表的第二个 csv 文件进行比较。而不是硬编码的文件。 我们如何将列表存储在特定路径中的 csv 中,然后比较该文件

【问题讨论】:

  • 现在你有 filename0filename1 但你仍然使用旧变量 filename - 这是错误
  • 如果你有两个文件名,那么你需要两个标签来显示名称,使用你必须使用read_csv两次来读取两个文件,并将数据保存在两个变量中,等等。
  • 您的代码有错误的缩进,我们不知道函数中有哪些行
  • 你能帮我写出正确的代码吗?

标签: python excel


【解决方案1】:

我不知道你想对数据做什么,所以我将 work_with_data(data1, data2) 保留为空,但这段代码显示了如何获取两个文件名,使用 read_csv() 两次,最后运行函数 work_with_data(data1, data2)

它还使用两个Labels 来显示两个文件名。

import tkinter as tk
import pandas as pd
from tkinter.filedialog import askopenfilename

# --- functions ---

def work_with_data(data1, data2):

    print(data1.head())
    print(data2.head())

    # ... here you can works with data1, data2 ...


def get_filenames():
    # default values before reading data

    data1 = None
    data2 = None

    # first filename and data1

    filename1 = askopenfilename(filetypes =[('CSV files', '*.csv')])

    if filename1:
        lbl1['text'] = filename1
        data1 = pd.read_csv(filename1)
    else:
        lbl1['text'] = 'Filename 1 not selected'

    # second filename and data2

    filename2 = askopenfilename(filetypes =[('CSV files', '*.csv')])

    if filename2:
        lbl2['text'] = filename2
        data2 = pd.read_csv(filename2)
    else:
        lbl2['text'] = 'Filename 2 not selected'

    # start working with data

    if data1 is not None and data2 is not None:
       work_with_data(data1, data2)

# --- main ---

root = tk.Tk()
#root.geometry('200x200')

lbl1 = tk.Label(root, text='Select filename 1')
lbl1.pack(side='top', pady=10)

lbl2 = tk.Label(root, text='Select filename 2')
lbl2.pack(side='top', pady=10)

btn = tk.Button(root, text='Open', command=get_filenames)
btn.pack(side='top', pady=10)

root.mainloop()

编辑:我更改了一些代码,以便您可以在work_with_data 中使用pandascsv.reader

import tkinter as tk
from tkinter.filedialog import askopenfilename
import pandas as pd

# --- functions ---

def work_with_data(filename1, filename2):

    # --- use pandas ---

    data1 = pd.read_csv(filename1)
    data2 = pd.read_csv(filename2)

    # ... here you can works with data1, data2 ...

    # --- or csv.reader ---

    fp1 = open(filename1)
    reader1 = csv.reader(fp1)

    fp2 = open(filename2)
    reader2 = csv.reader(fp2)

    # ... here you can works with reader1, reader2 ...

    fp2.close()   
    fp1.close()   


def get_filenames():
    # default values before reading data

    filename1 = None
    filename2 = None

    # first filename

    filename1 = askopenfilename(filetypes =[('CSV files', '*.csv')])

    if filename1:
        lbl1['text'] = filename1
    else:
        lbl1['text'] = 'Filename 1 not selected'

    # second filename

    filename2 = askopenfilename(filetypes =[('CSV files', '*.csv')])

    if filename2:
        lbl2['text'] = filename2
    else:
        lbl2['text'] = 'Filename 2 not selected'

    # start working with data

    if filename1 and filename2:
        work_with_data(filename1, filename1)

# --- main ---

root = tk.Tk()
#root.geometry('200x200')

lbl1 = tk.Label(root, text='Select filename 1')
lbl1.pack(side='top', pady=10)

lbl2 = tk.Label(root, text='Select filename 2')
lbl2.pack(side='top', pady=10)

btn = tk.Button(root, text='Open', command=get_filenames)
btn.pack(side='top', pady=10)

root.mainloop()

【讨论】:

  • 在数据 1 中,我想要来自第一个 csv 文件的列;在数据 2 中的另一列。现在,如果第一个 csv(列的值)中存在第二个 csv 的数据,那么它应该在另一个 csv 中报告这些值
  • 您在 data1 中拥有来自第一个 csv 的所有列,在 data2 中拥有来自第二个文件的所有列。现在您必须使用 data1 和 data2 来创建具有预期列的 data3 并将其保存在第三个 csv 文件中。但我不知道你对 data3 有什么期望。也许data1["FAC_TYPE"].isin( data2["FAC_TYPE"] )?文档:pandas.isin
  • 是的,我需要 data1["FAC_TYPE"].isin(data2["FAC_TYPE"])
  • import csv data = {} # 创建列表以存储数据,其中 open('check.csv', 'r') 作为查找列表,open('LOT55.csv', 'r') 作为csvinput, open('Output5.csv', 'w') as f_output: reader1 = csv.reader(lookuplist) reader2 = csv.reader(csvinput) csv_output = csv.writer(f_output) _tempFqdn = [] for i,dt in enumerate(reader1): if i==0: continue _tempFqdn.append(dt[0].strip()) for i,col in enumerate(reader2): if i==0: continue if col[9].strip( ) 在 _tempFqdn: csv_output.writerow(col)
  • 我已经尝试了上面的代码,你能帮我知道如何从 user.both 文件中动态获取它们
猜你喜欢
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
相关资源
最近更新 更多