Buggfix Plus
Aktuellt datum och tid: 04.14 2018-12-11

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 12 inlägg ] 
Författare Meddelande
InläggPostat: 23.35 2018-11-30 

Blev medlem: 18.00 2013-12-16
Inlägg: 35
Jag har en mapp med tio textfiler som sparas av ett program på datorn. Jag behöver ta sista raden i varje fil och trolla vidare, men bara när filen är "nysparad".
Jag har en timerlösning som går igenom mappen vid valda intervall. Har lyckats att printa både filnamn och senast ändrad.
Det jag har problem med är jämförelsen av skapat-tidpunkten för varje fil med föregående körning av loopen.

Gå igenom mappen
spara filnamn, skapad-tidpunkt
om ny-skapat-tidpunkt skiljer sig från skapad-tidpunkt :
ta sista raden i den filen och gör något
sätt skapad-tidpunkt för just denna fil = ny-skapd-tidpunkt
vänta en stund och kör igen


Upp
 Profil  
 
InläggPostat: 00.03 2018-12-01 
EF Sponsor
Användarvisningsbild

Blev medlem: 21.31 2005-12-15
Inlägg: 6274
Ort: Malmö
spara förgående tid i en lista.

filelist ska behållar mellan varje körning.

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
#någon slags pseudokod.
def scan():
   changed = []
   for filename in filenames:
      if filname in filelist:
         timestamp = file_update_time(filname)
         if filelist[filename] != timestamp:
            filelist[filename] = timestamp
            changed.append(filename) #old file updated
      else
         changed.append(filename) # new file found
   return changed


Upp
 Profil  
 
InläggPostat: 06.08 2018-12-01 

Blev medlem: 14.35 2005-02-03
Inlägg: 1064
Ort: Stockholm
Uh, vakna på soffan och stappla upp och läsa forumet i ottan, det är aldrig en bra idé. :hacker:

Python kan jag inte, men här har du ett fungerande exempel i Perl.
Det finns olika sätt att lagra filers datumstämpel.
Men datumstämpeln hör hemma som metadata i filsystemet, så varför inte låta filsystemet lagra det åt dig.

Du kan skapa en tom fil som heter t ex real_filename.txt.previous, som får lagra den förra datumstämpeln för filen real_filename.txt.
Det är vad som händer i scriptet nedan.
Sök på "###" i scriptet för att hitta de detaljer du behöver ändra för dina specifika syften;
1. Sökvägen till mappen där dina datafiler finns.
2. Regular expression som matchar mönstret på dina datafiler (exemplet nedan förväntar sig test01.txt, test02.txt, osv.
3. Platsen där du lägger till vad du vill göra med den sista raden i uppdaterade datafiler.

Scriptet kan schemaläggas i operativsystemet, jag skulle hellre göra så än att wrappa allt i en while(1) { ... } oändlig loop och ha scriptet permanent körande med en sleep(60); längst ner.
På tal om operativsystem så nämnde du aldrig vad det var, men det här funkar på både Linux/BSD/OSX och på Windows NT t o m Windows 10.

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. ### Set the correct path here to your folder with datafiles:
  6. my $folder = '/path/to/my/folder';
  7.  
  8. my ($datafile, $prevfile);
  9. my $prev_missing = 0;
  10.  
  11. opendir my $dh, $folder or die "Can't open '$folder': $!\n";
  12. while (defined($_ = readdir $dh)) {
  13.     # Only process relevant files.
  14.     next unless ($_ =~ m/^test\d\d\.txt$/); ### Set the correct filename pattern of your datafiles here.
  15.  
  16.     $datafile = $folder . '/' . $_;
  17.     $prevfile = $folder . '/' . $_ . '.previous';
  18.  
  19.     # Read modified time of the datafile.
  20.     my ($data_mtime) = (stat $datafile)[9];
  21.  
  22.     # Create a date reference file if none exists.
  23.     unless (-e $prevfile) {
  24.         # Create an empty file, only filesystem metadata will be used.
  25.         open my $prev_fh, '>', $prevfile or die "Can't open '$prevfile' for writing: $!\n";
  26.         print $prev_fh '';
  27.         close $prev_fh;
  28.  
  29.         # Set modified time on prevfile to that of datafile.
  30.         utime(time, $data_mtime, $prevfile);
  31.  
  32.         # All of the above can be replaced by this:
  33.         #system(qq(touch -r "$datafile" "$prevfile"));
  34.  
  35.         # Set flag to indicate that prevfile was missing, so last line of datafile will still be processed.
  36.         $prev_missing = 1;
  37.  
  38.         print "Created file:\n$prevfile\n";
  39.     }
  40.  
  41.     # Read modified time of the prevfile.
  42.     my ($prev_mtime) = (stat $prevfile)[9];
  43.  
  44.     # Process current datafile if it is newer than the prevfile, or if the flag has been set to indicate first execution.
  45.     if ($data_mtime > $prev_mtime or $prev_missing == 1) {
  46.         open my $data_fh, '<', $datafile or die "Can't open '$datafile' for reading: $!\n";
  47.         foreach my $lastline (reverse <$data_fh>) {
  48.             # Remove CR/LF/CRLF.
  49.             chomp $lastline;
  50.            
  51.             print "File:\n$datafile\n";
  52.             print "Last line:\n'$lastline'\n\n";
  53.             ### Do something useful with $lastline here.
  54.            
  55.             last;
  56.         }
  57.         close $data_fh;
  58.  
  59.         # Set modified time on prevfile to that of datafile.
  60.         utime(time, $data_mtime, $prevfile);
  61.        
  62.         # Unset flag.
  63.         $prev_missing = 0;
  64.     }
  65. }

Kanske funkar att ha som mall för att skriva om i Python, om inte annat. :)

Notera att programmet touch i Linux/BSD/OSX kan användas för att förenkla scriptet, du kan ange den riktiga filen som referens, samma kommando både skapar en tom fil om den saknas, och sätter datumstämpeln till samma värde som på referensfilen, och finns filen redan så uppdateras bara datumstämpeln på den:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
touch -r real_filename.txt real_filename.txt.previous
Använder du det och har mellanslag i sökvägen eller filnamnen, då får du komma ihåg att wrappa filnamnen i citat-tecken på kommandoraden, se exemplet i den bortkommenterade raden i scriptet.


Upp
 Profil  
 
InläggPostat: 16.04 2018-12-01 

Blev medlem: 18.00 2013-12-16
Inlägg: 35
Jag tackar för visat engagemang: Det var ju inte meningen att väcka folk på en lördagsmorgon. :ledsen:

Jag har kommit en bit längre med detta. för mig var det dict (och en natts sömn) som var lösningen. Klistrar in koden ifall någon skulle råka surfa in. Tror att det funkar. Har inte tillgång till systemet som genererar filerna nu. Får se om jag har ork att skriva en snutt som genererar filer samtidigt som detta script kollar.

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
#!/usr/bin/python
# -*- coding: ISO-8859-1  -*-

import os
import time
from threading import Timer
from time import sleep
os.system("cls")


def check():
   for key in original_dict:
      # print (key) #test
      if original_dict.get(key) < os.path.getmtime(key):
         print ("File {} has been modified".format(f))
         original_dict[key] = os.path.getmtime(key)
      else:
         print ("No changes, going to sleep.")   
         
   t = Timer(5,check)
   t.start()

   
original_dict={}

for files in os.listdir():
   if files[0]=="L" and files[-3:]=="TXT": #kollar om första tecknet i filnamnet är L och sista 3 är txt
      original_dict[files] = os.path.getmtime(files) #lägger till filnamn: skapad-tid i en dictionary

t = Timer(5, check)
t.start() # after 5 seconds check

# timer will wake up every 10 seconds, while we do something else
while True:
   print ("do something else")
   sleep(10)


Upp
 Profil  
 
InläggPostat: 21.26 2018-12-05 

Blev medlem: 13.15 2010-11-14
Inlägg: 146
Ort: Sandviken
Beroende på vilket OS du vill köra på så finns olika metoder att lyssna på förändringar i filsystemet utan att manuellt polla efter förändringar.
Linux har t.ex. inotify som du kan använda med pyinotify
https://github.com/seb-m/pyinotify/wiki/Tutorial

i windows så kan du använda win32-anrop
http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html

Sedan finns följande bibliotek som väljer metod beroende på os.
https://pypi.org/project/watchdog/


Upp
 Profil  
 
InläggPostat: 22.13 2018-12-05 

Blev medlem: 08.04 2012-06-19
Inlägg: 242
Ort: Lund
Timestamp känns skakigt. Jag förslår att du lutar dig mot "tail" som fungerat deterministiskt i väldigt många år. Det gör jag.
Se denna https://stackoverflow.com/questions/12523044/how-can-i-tail-a-log-file-in-python.


Upp
 Profil  
 
InläggPostat: 20.51 2018-12-06 

Blev medlem: 18.00 2013-12-16
Inlägg: 35
Tack för kompletterande svar. :)
Har lyckats fånga den sista raden i respektive log-fil nu. Nästa steg bli att försöka skicka de raderna till en annan dator i samma lokala nätverk. Har absolut noll koll men har börjat att läsa på om sockets, TCP, meddelandeköer mm.
Skulle jag få till ett någotsånär fungerande variant på detta så ska jag kolla igenom tipsen igen. Det såg intressant ut.


Upp
 Profil  
 
InläggPostat: 00.35 2018-12-07 

Blev medlem: 09.47 2013-09-19
Inlägg: 178
Ort: Kristianstad
Dela ut en katalog på den ena och montera på den andra.

.


Upp
 Profil  
 
InläggPostat: 10.55 2018-12-07 

Blev medlem: 18.00 2013-12-16
Inlägg: 35
Menar du så enkelt som molnet och dropbox?
Eller ännu enklare med windows egna funktioner?
:humm:


Upp
 Profil  
 
InläggPostat: 21.52 2018-12-07 

Blev medlem: 09.47 2013-09-19
Inlägg: 178
Ort: Kristianstad
Du delar ut med tex protokollet NFS. Finns enkla howto på nätet. Om det är två Linux maskiner. Annars Samba som funkar med Windows.

.


Upp
 Profil  
 
InläggPostat: 22.44 2018-12-07 

Blev medlem: 22.27 2012-05-26
Inlägg: 27
Ort: Ursviken
SCP eller RCP är väl bra. Secure copy eller remote copy.
https://pypi.org/project/scp/


Upp
 Profil  
 
InläggPostat: 17.10 2018-12-08 

Blev medlem: 18.00 2013-12-16
Inlägg: 35
Kollar länkar och funderar. För att vara lite tydligare:

Dator med win 7
Loggar händelser från 10 st. indata. Dessa händelser sker med c:a 30-60 sek intervall.
Data lagras som en rad i en .txt-fil. En fil för varje indataström. (Log n.txt).
Ovanstående går inte ändra på.

Lokalt nätverk.
(rapplig anslutning mot internet)

Dator med Win 10H
Slutmål är att kunna hantera / visa data på valfritt format.

Läser vidare...


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 12 inlägg ] 

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 9 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010