2017-07-12 2 views
-1

Ich versuche, von Matlab in Python zu kommen, also, beginnend klein, ich bin beim Lesen und Schreiben von Daten. Ich wurde von Matlabs exzellenter, in sich abgeschlossener Dokumentation verwöhnt und habe Schwierigkeiten, den besten Ansatz in Python zu finden, um Matlab in erster Linie mit fopen, textscan, fgetl, regexp und fprintf zu erreichen. Ich habe einige Befürworter numpy.loadtxt (& savetxt) gesehen, während andere einen Ansatz "mit offenem (...) als f: für Linie ..." befürworten - letzteres könnte sein, was ich in diesem Fall des Lesens von a Spalte von String-Headern, gefolgt von einer Matrix von Floating-Nummern, beide von unbekannter Größe. Ich habe Matlab-Code zusammen probieren, dass:Lesen und Schreiben von Daten in Python (Matlab-Benutzer)

  1. Liest den Pfad und den Namen einer Datei zu lesen, wie in einer Textdatei angegeben, und kombiniert sie zu einem einzigen String
  2. Bestimmt die Anzahl der Header in der Datei von 1, und die Größe der Matrix von durch Kommas getrennte schwimmende Daten unterhalb der Header
  3. Liest die Header und die Matrix in der Datei von 1, getrennt in zwei Variablen
  4. schreiben die Header und Matrix zu einer anderen Datei

Einige dieser Schritte, zum Beispiel 2-3, könnten in der Praxis kombiniert werden, aber sie hier zu trennen hilft mir bei einigen unterschiedlichen Aufgaben. Dies ist vielleicht eher eine "bitte teilen Sie mit mir die besten Programmierpraktiken in Python für diese generische Aufgabe" anstatt einer sehr spezifischen Frage, aber ich denke, dass dies auch für andere neue Python-Benutzer nützlich wäre. Danke für jeden spezifischen Python-Code und/oder Referenzen.

%% 
function ReadWrite() 
tic 
f=readPaths(); 
[t,n]=pullSize(f); 
[hdr,d]=readData(f,t,n); 
writeData(hdr,d); 
toc 
end 
%% 
function f=readPaths 
fid=fopen('Paths.txt','r'); 
f=textscan(fid,'%s%s','delimiter','\t','headerlines',1); 
fclose(fid); 
f=char(fullfile(f{1},f{2})); 
end 
%% 
function [t,n]=pullSize(f) 
n=0; 
fid=fopen(f,'r'); 
l=fgetl(fid); 
h=isempty(regexp(l,',','once')); % headers are not comma delimited 
while h 
    n=n+1; 
    l=fgetl(fid); 
    h=isempty(regexp(l,',','once')); 
end 
fclose(fid); 
t=length(regexp(l,','))+1; % file is comma delimited 
end 
%% 
function [hdr,d]=readData(f,t,n) 
fid=fopen(f,'r'); 
hdr=textscan(fid,'%s',n); 
d=textscan(fid,repmat('%f',1,t),'delimiter',','); 
fclose(fid); 
d=[d{:}]; 
hdr=[hdr{:}]; 
end 
%% 
function writeData(hdr,d) 
fid=fopen('DataTest.csv','w'); 
for i=1:length(hdr) 
    fprintf(fid,'%s\n',hdr{i}); 
end 
fprintf(fid,[repmat('%.4f,',1,size(d,2)-1),'%.4f\n'],d'); 
fclose(fid); 
end 
+0

Sie auch Ihr 'matlab' Code – davedwards

+0

Dank einschließen möchten könnten den [Matlab] (https://stackoverflow.com/tags/matlab/info) Tag für die Benutzer vertraut mit dem Lesen, aber ich habe ursprünglich und ein Moderator entfernte die Matlab-Flagge. – Aaron

+0

Es gibt eine Code-Review-Stack-Tausch-Site für diese Art von Frage. – TheBlackCat

Antwort

0

Danke an alle. Ich stocherte ursprünglich mit dem csv-Modul und einigen anderen Dingen herum, die Sie vorgeschlagen haben, benutzte aber meistens numpy's [save] txt zusammen mit Standard-Pythons readline und einigen anderen Bibliotheken für bestimmte Dinge. Ich kam heute nur zurück und es dauerte eine Weile, bis ich verschachtelte Funktionen, Lese-/Schreibformatierung und so weiter fand, aber ich replizierte den Code und es ist nur ein bisschen langsamer als meine Matlab-Version - einschließlich hier für die Nachwelt:

import numpy as np 
import os 
from itertools import islice 
import time 


def readwrite(): 
    tic = time.time() 
    f = read_paths('Paths.txt') 
    n = pull_size(f) 
    hdr, d = read_data(f, n) 
    write_data('Data_Py.txt', hdr, d) 
    toc = time.time() 
    with open('Runtime_Py.txt', 'w') as fid: 
     fid.write("Elapsed time is %.6f seconds." % (toc - tic)) 


def read_paths(f): 
    f = np.loadtxt(f, dtype='str', delimiter='\t', skiprows=1) 
    return os.path.join(f[0], f[1]) 


def pull_size(f): 
    n = 0 
    with open(f, 'r') as fid: 
     l = fid.readline() 
     h = not(l.count(',')) # headers are not comma delimited 
     while h: 
      n = n + 1 
      l = fid.readline() 
      h = not (l.count(',')) 
    # t = l.count(',') + 1 # file is comma delimited 
    return n 


def read_data(f, n): 
    with open(f, 'r') as fid: 
     hdr = ''.join(list(islice(fid, n))) 
    hdr = hdr.rstrip('\n') 
    d = np.loadtxt(f, dtype='float', delimiter=',', skiprows=n) 
    return hdr, d 


def write_data(f, hdr, d): 
    np.savetxt(f, d, fmt='%.2f', delimiter=',', newline='\n', header=hdr, 
comments='') 

readwrite() 
1

Dies scheint wie etwas, das Sie möglicherweise für die Pandas-Bibliothek verwenden möchten. Pandas hat eine read_csv-Methode, die genau das tut, was sich anhört und die Daten in einem sogenannten DataFrame speichert, den Sie im Grunde als Excel-Tabelle betrachten können.

http://pandas.pydata.org/

Die Funktionalität ist ähnlich der Datenrahmen R oder data.table Paket.

+0

Danke, ich habe Pandas gegoogelt und einige gesehen, dass es viel schneller ist als numpy.load [speichern] txt, damit ich mir das in Zukunft genauer ansehen werde. – Aaron

1

Sie können dazu das csv-Modul in der Python-Standardbibliothek verwenden.

import csv 

with open('path/to/file.csv', 'r') as f: 
    dict_reader = csv.DictReader(f) 

with open('path/to/output.csv', 'w') as w: 
    dict_writer = csv.DictWriter(w, dict_reader.fieldnames) 
    dict_writer.writeheader() 
    dict_writer.writerows(dict_reader) 
Verwandte Themen