首页 > 解决方案 > 自动 Savetxt 为 CSV Python

问题描述

我有兴趣剪切数据集,然后按照名称模式自动保存它(例如:block1.csv,block2.csv ....)现在我正在手动进行,我的代码是:

import csv 
import tkinter as tk
from tkinter import filedialog
import numpy as np
import pandas as pd
import geopandas as gpd
from geopandas import GeoSeries
from shapely.geometry import Polygon
from shapely.geometry import Point 

    
    
root= tk.Tk()

canvas1 = tk.Canvas(root, width = 400, height = 400, bg = 'gray1', relief = 'raised')
canvas1.pack()
#--------------START---IMPORT-------------------
def getCSV ():
    global df
    
    import_file_path = filedialog.askopenfilename()
    df = np.genfromtxt(import_file_path, delimiter='_', missing_values = ' ', filling_values = None)
    
    print (df)
    
browseButton_CSV = tk.Button(text=" Import CSV File to clip ", command=getCSV, bg='OrangeRed4', fg='black', font=('helvetica', 12, 'bold'))
canvas1.create_window(200, 200, window=browseButton_CSV)

root.mainloop()


#--------------END---IMPORT------------------------------------

x, y, z, mag = df[:,0], df[:,1], df[:,2], df[:,3]


xmin, ymin = np.min(x), np.min(y)
xmax, ymax = np.max(x), np.max(y)
dtSeries = GeoSeries(map(Point, zip(x,y,z,mag)))


def clipping( x, y, z, mag, xc, yc):
    
    df1 = pd.DataFrame({'X':x, 'Y':y, 'Z':z, 'MAG':mag})
    df1['geometry'] = list(zip(df1['X'], df1['Y'], df1['Z']))
    df1['geometry'] = df1['geometry'].apply(Point)
    gdfMAGN = gpd.GeoDataFrame(df1, geometry='geometry')
    
    x1, y1 = xc, yc
    # ____________[90000m X 90000m] IS THE WINDOW DIMENSIONS______________
    
    clipAr = Polygon([ (x1, y1), (x1, y1+90000), (x1 + 90000, y1 + 90000), (x1+90000, y1)])
    pol = gpd.GeoDataFrame([1], geometry=[clipAr] )
    
    res = gpd.clip(gdfMAGN, pol)
    resCSV = np.array([res['X'],res['Y'],res['Z'],res['MAG']]).T
    
    
    #---------------------START---SAVE---------------------
    root= tk.Tk()

    canvas1 = tk.Canvas(root, width = 300, height = 300, bg = 'gray1', relief = 'raised')
    canvas1.pack()

    def saveCSV ():
        global df
    
        export_file_path = filedialog.asksaveasfilename( defaultextension=".csv", filetypes=[("CSV files", '*.csv')])
        np.savetxt(export_file_path, resCSV, delimiter='_')
    
    
    browseButton_CSV = tk.Button(text="      Export filled CSV Data File     ", command=saveCSV, bg='OrangeRed4', fg='black', font=('helvetica', 12, 'bold'))
    canvas1.create_window(150, 150, window=browseButton_CSV)

    root.mainloop()
    #------------------------END---SAVE--------------------
    
xc, yc = np.min(x), np.min(y)

while True:
#---------45000m IS THE STEP -----------------------
    if xc = np.max(x):
        if yc = np.max(y):
            clipping(x, y, z, mag, xc, yc)
            break
        else:
            xc = xmin 
            yc = yc + 45000
    else:
        clipping(x, y, z, mag, xc, yc)
        xc = xc + 45000


标签: pythonpandasnumpytkintergeopandas

解决方案


为了使用遵循我演示的模式的名称自动保存结果,我添加了以下代码行并删除了 saveCSV()。我只保留了 np.savetxt(....)。有了它们,我得到一个路径作为输入,我从中删除最后一部分并得到文件路径。

 #-------------------START---------GET   PATH---------------------------
root= tk.Tk()

canvas1 = tk.Canvas(root, width = 300, height = 300, bg = 'gray1', relief = 'raised')
canvas1.pack()

def getPath ():
    global path
    
    path = filedialog.asksaveasfilename( defaultextension=".txt", filetypes=[("TXT files", '*.txt')])
    
    print(path)
        
    
browseButton_CSV = tk.Button(text="      Set PATH     ", command=getPath, bg='OrangeRed4', fg='black', font=('helvetica', 12, 'bold'))
canvas1.create_window(150, 150, window=browseButton_CSV)

root.mainloop()

#--------------------END-------GET   PATH---------------------------------------------

print(path)
strin = np.array([])
for i in path:
    strin=np.append(strin, i)
ind = np.where(strin=="/" )

j = str()
for i in path[0:(ind[0][len(ind[0])-1]+1)]:
    j += i
path  = j

print(path)

我还在 clipping() 中添加了 2 个额外的变量路径和块以及以下代码行来为每个 csv 创建路径和名称。

pathBlock = path + 'block' + str(bl) + '.csv'
np.savetxt(pathBlock, resCSV, delimiter='_')

推荐阅读