Uh, vakna på soffan och stappla upp och läsa forumet i ottan, det är aldrig en bra idé.
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: Markera allt
#!/usr/bin/perl
use strict;
use warnings;
### Set the correct path here to your folder with datafiles:
my $folder = '/path/to/my/folder';
my ($datafile, $prevfile);
my $prev_missing = 0;
opendir my $dh, $folder or die "Can't open '$folder': $!\n";
while (defined($_ = readdir $dh)) {
# Only process relevant files.
next unless ($_ =~ m/^test\d\d\.txt$/); ### Set the correct filename pattern of your datafiles here.
$datafile = $folder . '/' . $_;
$prevfile = $folder . '/' . $_ . '.previous';
# Read modified time of the datafile.
my ($data_mtime) = (stat $datafile)[9];
# Create a date reference file if none exists.
unless (-e $prevfile) {
# Create an empty file, only filesystem metadata will be used.
open my $prev_fh, '>', $prevfile or die "Can't open '$prevfile' for writing: $!\n";
print $prev_fh '';
close $prev_fh;
# Set modified time on prevfile to that of datafile.
utime(time, $data_mtime, $prevfile);
# All of the above can be replaced by this:
#system(qq(touch -r "$datafile" "$prevfile"));
# Set flag to indicate that prevfile was missing, so last line of datafile will still be processed.
$prev_missing = 1;
print "Created file:\n$prevfile\n";
}
# Read modified time of the prevfile.
my ($prev_mtime) = (stat $prevfile)[9];
# Process current datafile if it is newer than the prevfile, or if the flag has been set to indicate first execution.
if ($data_mtime > $prev_mtime or $prev_missing == 1) {
open my $data_fh, '<', $datafile or die "Can't open '$datafile' for reading: $!\n";
foreach my $lastline (reverse <$data_fh>) {
# Remove CR/LF/CRLF.
chomp $lastline;
print "File:\n$datafile\n";
print "Last line:\n'$lastline'\n\n";
### Do something useful with $lastline here.
last;
}
close $data_fh;
# Set modified time on prevfile to that of datafile.
utime(time, $data_mtime, $prevfile);
# Unset flag.
$prev_missing = 0;
}
}
closedir $dh;
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: Markera allt
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.