Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: Εύρεση string σε αρχείο.

Εύρεση string σε αρχείο. 8 Χρόνια 10 Μήνες πριν #2994

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Καλησπέρα.

Πείτε ότι έχω ένα αρχείο βίντεο το οποίο το ανοίγω σε binary mode.
Επίσης θεωρήστε ότι το αρχείο αυτό περιέχει μόνο μία πληροφορία σε bytes η οποία αναπαριστά
ένα string με το όνομα του αρχείο βίντεο, ενώ οι άλλες πληροφορίες απλώς αναπαριστούν το βίντεο.

Υπάρχει τρόπος να βρω αυτήν την πληροφορία και να την αποκωδικοποιήσω με το bytes.decode?
Έτσι ώστε να μπορέσω να τυπώσω στην οθόνη το όνομα του βίντεο.

Δοκίμασα να προσπελάσω το αρχείο ανά λίγα bytes και ταυτόχρονα προσπαθούσα να τα αποκωδικοποιήσω
και να ελέγχο εάν είναι αυτό που θέλω.
Για παράδειγμα:
file = open("a.txt", 'rb')
 
while True:
 
    Bytes = file.read(5)
 
 
    #Τέλος του αρχείου.
    if not Bytes:
        break
 
 
 
    #Προσπαθώ να αποκωδικοποιήσω την πληροφορία των 5 bytes
    #σε string.
    try:
        string = bytes.decode(Bytes)
 
        if (string == "Harry Potter.mkv"):
            print("The name of the video has been found.")
 
    #H αποκωδηκοποίηση απέτυχε λογικά γιατί η πληροφορία των 5
    #byetes δεν αναπαριστούν ένα string αλλά κάτι άλλο.
    except:
        pass  

Αυτό σίγουρα δεν λειτουργεί διότι δεν είναι σίγουρο ότι άμα πηγαίνω ανά 5 bytes μέσα στο αρχείο κάποτε θα διαβάσω ακριβώς τα bytes που αναπαριστούν την πληροφορία string που θέλω. Πρώτον η πληροφορία που ψάχνω μπορεί να αποτελείτε από λιγότερα ή περισσότερα από 5 bytes. Δεύτερον ακόμα και αν αποτελείτε από 5 bytes πάλι δεν είναι σίγουρο ότι κάποτε θα διαβαστούν ακριβώς τα 5 bytes τα οποία θέλω. Άρα αυτός ο τρόπος αναζήτησης είναι εντελώς λάθος.

Ελπίζω να καταλάβατε τη εννοώ και να γνωρίζετε την λύση.
Ευχαριστώ.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Εύρεση string σε αρχείο. 8 Χρόνια 10 Μήνες πριν #2995

  • embryo
  • Το Άβαταρ του/της embryo
  • Αποσυνδεμένος
  • pyth__
  • Δημοσιεύσεις: 92
  • Ληφθείσες Ευχαριστίες 31
Κατ' αρχάς για να συγκεκριμενοποιήσω την κατάσταση πρέπει να σου πω ότι συνήθως τα αρχεία δεν έχουν το filename τους γραμμένο μέσα στο binary μέρος τους.
Αν υπάρχει η πληροφορία τίτλου, συνήθως είναι σε κάποιο tag.
Για να διαβάσω τα tags (που είναι διαφορετικά για κάθε τύπο αρχείου) χρησιμοποιώ το MediaInfo.dll (με κάποιο python binding).

Αν, τώρα, αυτό που σε ενδιαφέρει είναι να διαβάσεις τα strings που εμπεριέχονται σε ένα binary, μπορείς να το κάνεις διαβάζοντας όλο το αρχείο και μεταφράζοντας τα strings.
Δες αυτή την ερώτηση στο stackoverflow.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Εύρεση string σε αρχείο. 8 Χρόνια 10 Μήνες πριν #2996

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Να ρωτήσω κάτι άλλο. Πες ότι έχω δύο αρχεία test1.txt και test2.txt και θέλω να δημιουργήσω ένα
αρχείο test.zipper στο οποίο θα γράψω τα bytes και από το test1.txt αλλά και από το test2.txt .

Μπορώ με κάποιον τρόπο να βάλω ένα flag έτσι ώστε να ξεχωρίζω τα bytes στο αρχείο test.zipper?
Δηλαδή να μπορώ να γνωρίζω από που μέχρι που τα bytes αποτελούν το αρχείο test1.txt και από που
μέχρι που αποτελούν το αρχείο test2.txt.

Δείτε και ένα παράδειγμα για το πως περίπου θέλω να είναι ο κώδικα.
def zipFile():
    file1 = open("test1.txt", "rb")
    file2 = open("test2.txt", "rb")
 
    zipFile = open("test.zipper", "wb")
 
    zipFile.write( file1.read() )
    zipFile.write(  ) #Εδώ θέλω να γράψω κάτι το οποίο να αποτελεί ένα
                      #σημάδι για να ξέρω ότι εδώ τελειώνουν τα bytes του
                      #πρώτου αρχείου.
 
 
    zipFile.write( file2.read() )
    zipFile.write(  ) #Εδώ θέλω να γράψω κάτι το οποίο να αποτελεί ένα
                      #σημάδι για να ξέρω ότι εδώ τελειώνουν τα bytes του
                      #δεύτερου αρχείου.

Εκεί που λέω για ένα σημάδι στην ουσία θα ήθελα να βάλω τα εξής, στο πρώτο str.encode("test1.txt") και στο δεύτερο str.encode("test2.txt") για να μπορώ
όταν αποσυμπιέζω το αρχείο .zipper όχι μόνο να γνωρίζω από που μέχρι που βρίσκονται
τα bytes του κάθε αρχείου αλλά και τι όνομα να δώσω στα αρχεία που θα δημιουργήσω.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Εύρεση string σε αρχείο. 8 Χρόνια 9 Μήνες πριν #3006

  • myle
  • Το Άβαταρ του/της myle
  • Αποσυνδεμένος
  • Admin
  • Δημοσιεύσεις: 467
  • Ληφθείσες Ευχαριστίες 15
Μπορείς να δημιουργήσεις ένα μικρό header (κεφαλίδα) που να περιγράφει ποια αρχεία είναι μέσα στο τελικό αρχείο που δημιουργείς αλλά και πόσο χώρο καταλαμβάνουν. Αυτή η κεφαλίδα μπορεί να βρίσκεται στην αρχή του αρχείου και να τελειώνει με κάποια ειδική ακολουθία.

Πχ:

Header:
Αρχείο1.txt -> 123456 bytes
Αρχείο2.txt -> 345 bytes
Αρχείο3.txt -> 2435 bytes
EndOfHeader
Αρχείο1_περιεχόμενα...
Αρχείο2_περιεχόμενα...
Αρχείο3_περιεχόμενα...
«Αν υποθέσουμε ότι αυτό είναι δυνατό, (να μεταδώσουμε τη σοφία παντού) τότε ειλικρινά ο τρόπος ζωής των θεών θα περάσει στους ανθρώπους. Τα πάντα θα είναι γεμάτα...
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Εύρεση string σε αρχείο. 8 Χρόνια 9 Μήνες πριν #3009

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
myle έγραψε:
Μπορείς να δημιουργήσεις ένα μικρό header (κεφαλίδα) που να περιγράφει ποια αρχεία είναι μέσα στο τελικό αρχείο που δημιουργείς αλλά και πόσο χώρο καταλαμβάνουν. Αυτή η κεφαλίδα μπορεί να βρίσκεται στην αρχή του αρχείου και να τελειώνει με κάποια ειδική ακολουθία.

Πχ:

Header:
Αρχείο1.txt -> 123456 bytes
Αρχείο2.txt -> 345 bytes
Αρχείο3.txt -> 2435 bytes
EndOfHeader
Αρχείο1_περιεχόμενα...
Αρχείο2_περιεχόμενα...
Αρχείο3_περιεχόμενα...

Α!!!, Δηλαδή , με αυτές τις πληροφορίες όταν κάνω unzip, αυτό που θα κάνω θα είναι να διαβάζω ένα byte κάθε φορά μέχρι να φτάσω το συγκεκριμένο αριθμό bytes. Δηλαδή αρχίζω από το πρώτο byte, και καθώς διαβάζω θα έχω και έναν μετρητή. Έτσι όταν ο μετρητής φτάσει 123456 τότε έχω διαβάσει τα bytes του Αρχείο1.txt, στην συνέχεια μόλις διαβάσω άλλα 345 bytes θα έχω τα bytes του Αρχείο2.txt κ.ο.κ, σωστά;
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Εύρεση string σε αρχείο. 8 Χρόνια 9 Μήνες πριν #3010

  • myle
  • Το Άβαταρ του/της myle
  • Αποσυνδεμένος
  • Admin
  • Δημοσιεύσεις: 467
  • Ληφθείσες Ευχαριστίες 15
Ακριβώς! Μόνο που πρέπει να αρχίσεις το μέτρημα μετά το τέλος του Header.


Μια άλλη επιλογή θα ήταν να αποθηκεύεις πέρα από το μέγεθος του αρχείου, και το που αυτό αρχίζει σε διαμόρφωση (αρχείο, αρχικό byte, μέγεθος). Πχ:

Όνομα: Αρχείο1.txt, Θέση: 300, Μέγεθος: 123456
Όνομα: Αρχείο2.txt, Θέση: 123756, Μέγεθος: 345
Όνομα: Αρχείο3.txt, Θέση: 124101, Μέγεθος: 2435
EndOfHeader
Αρχείο1_περιεχόμενα...
Αρχείο2_περιεχόμενα...
Αρχείο3_περιεχόμενα...

Για έμπνευση, μπορείς να δεις πως είναι το zip format αν και αυτό είναι πολύ πιο περίπλοκο σε σχέση με το τι θες να πετύχεις:
en.wikipedia.org/wiki/Zip_(file_format)
«Αν υποθέσουμε ότι αυτό είναι δυνατό, (να μεταδώσουμε τη σοφία παντού) τότε ειλικρινά ο τρόπος ζωής των θεών θα περάσει στους ανθρώπους. Τα πάντα θα είναι γεμάτα...
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Εύρεση string σε αρχείο. 8 Χρόνια 9 Μήνες πριν #3011

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Το έκανα. Δουλεύει σε απλά αρχεία, δηλαδή αρχεία που περιέχουν string μέσα, αλλά σε άλλα αρχεία όπως μουσικής ή video και άλλα, μου πετάει αυτό το σφάλμα:

D:\>python zipper.py -unzip a.zipper
Traceback (most recent call last):
File "zipper.py", line 299, in <module>
main(sys.argv)
File "zipper.py", line 51, in main
unzipFile(argv[2])
File "zipper.py", line 144, in unzipFile
string = file.readline() #Reading a line.
File "D:\python34\lib\encodings\cp1253.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8c in position 798: character maps
to(undefined)


Αλλά δεν προσπαθώ πουθενά να αποκωδικοποιήσω byte, και δεν ξέρω γιατί μου το πετάει το σφάλμα.

Μπορείς να ρίξεις μια ματιά;

Ο κώδικας είναι αυτό:
# -*- coding: utf-8 -*-
 
#FileName   : zipper.py
#Programmer : Nick Bampaliaris
 
import sys, os
 
running = True
 
 
 
 
 
def main(argv):
 
    listOfFiles = []
 
    #Missing options.
    if ( len(argv) < 2):
        print("You must give an option(-zip or -unzip).")
        print("Syntax: -option filename listOfFiles\n\n")
        sys.exit()
        pass
 
 
    #Missing filename.
    elif (len(argv) < 3):
        print("You must give the name of the file.\n")
        print("Syntax: -option filename listOfFiles\n\n")
        sys.exit()
 
 
    #Collecting the filenames from the input.
    for i in range(3, len(argv)):
        listOfFiles.append(argv[i])
        pass
 
 
    #Take the size fo the files.
    sizes = findFileSize(listOfFiles)
 
 
    #Zip the Files.
    if (argv[1] == "-zip"):
        createZipFile(argv[2], listOfFiles, sizes)
        pass
 
 
    #Unzip File.
    elif (argv[1] == "-unzip"):
        unzipFile(argv[2])
        pass
 
 
    #Uknown option.
    else:
        print("Uknown option: \""+argv[1]+"\"\n\n")
        sys.exit()
 
 
 
 
def createZipFile(zipName, filenames, sizes):
 
    file = open(zipName, "w")
    headerSize = 0
 
 
    #------------------------Creating the Header------------------------#
    file.write("<Header>\n") #Start header.
 
    #Writting the headLines.
    for i in range(0, len(filenames)):
 
        #Replace spaces with underscore.
        if (" " in filenames[i]):
            string = filenames[i].replace(" ", "_")
            pass
 
        else:
            string = filenames[i]
 
        #Write the header.
        headerSize += file.write(nameFromPath(string)+" "+str(sizes[i])+"\n")
        pass
 
    file.write("</Header>\n") #Close header.
    file.close()
    #------------------------Creating the Header------------------------#
 
 
 
    #------------------Writting the bytes of the files------------------#
    zipFile = open(zipName, "ab")
    zipFile.seek(headerSize)
 
 
    for filename in filenames:
 
        try:
            file = open(filename, "rb")
            zipFile.write(file.read())
            file.close()
            pass
 
        except:
            print("The file \""+filename+"\" could not been opened.\n")
            sys.exit()
            pass
 
 
    zipFile.close()
    #------------------Writting the bytes of the files------------------#
 
 
 
 
 
 
def unzipFile(filename):
 
    filenames  = []
    sizes      = []
    headerSize = 0
 
    #Trying to open the file.
    try:
        file = open(filename, "r")
        pass
 
    #File could not been found.
    except:
        print("The file \""+filename+"\" could not been opened.\n")
        sys.exit()
        pass
 
 
    #-------------Taking info from the Header-------------#
    while (running):
 
        name = ''
        size = ''
 
        string = file.readline() #Reading a line.
        headerSize += len(list(string)) #Taking the amount of bytes of the line.
 
 
        #End of header.
        if (string == "</Header>\n"):
            break
 
        #Recover information.
        elif(string != "<Header>\n"):
 
            lstring = list(string) #make list from the string.
 
            #-----Recovering the name of the file-----#
            while (running):
 
                if (lstring[0] != ' '):
                    name += lstring[0]
                    lstring.remove(lstring[0])
                    pass
 
                else:
                    break
                pass
            #-----Recovering the name of the file-----#
 
 
            #-----Recovering the size of the file-----#
            for i in range(1, len(lstring)):
 
                if (lstring[i] != '\n'):
                    size += lstring[i]
                    pass
 
                else:
                    break
                pass
            #-----Recovering the size of the file-----#
 
            filenames.append(name) #Append name.
            sizes.append(int(size))#Append size.
            pass
        pass
    #-------------Taking info from the Header-------------#
 
    file.close() #Closing the file.
 
    file = open(filename, "rb") #Open again the file in read byte mode.
 
    file.seek(headerSize+4) #Move the cursor in the pos where the file bytes begin(Under the header).
 
 
    for i in range(0, len(sizes)):
 
        fileName = filenames[i]
        fileSize = sizes[i]
 
        newFile = open(fileName, "wb")
 
        while (fileSize > 0):
 
            newFile.write(file.read(1))
            fileSize -= 1
            pass
 
        newFile.close()
        pass
 
    file.close()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
def findFileSize(filenames):
 
    sizes = []
 
    for filename in filenames:
 
        #Trying to open the file.
        try:
            file = open(filename, "r")
            size = os.path.getsize(filename)
            sizes.append(size)
            file.close()
            pass
 
 
        #Failed to open.
        except:
            print("The file \""+filename+"\" could not been opened.\n")
            sys.exit()
            pass
        pass
 
 
    return sizes
 
 
 
 
 
#Επιστρέφει το όνομα ενός αρχείου από το path.
#Δηλαδή αν path = "c:\downloads\file.txt" τότε θα
#επιστρέψει "file.txt"
def nameFromPath(path):
 
    path  = list(path)
    string= ""
    count = 0
 
    for i in range(0, len(path)):
 
        if (path[i] == "/" or path[i] == "\\"):
            count+=1
            pass
        pass
 
 
    if (count == 0):
        return path
 
 
    while (count > 0):
 
        if (path[0] == "/" or path[0] == "\\"):
            count -= 1
            pass
 
        path.remove(path[0])
        pass
 
 
    for char in path:
 
        string += char
        pass
 
    return string
 
 
 
 
 
 
 
if (__name__ == "__main__"):
    main(sys.argv)
Τελευταία διόρθωση: 8 Χρόνια 9 Μήνες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Εύρεση string σε αρχείο. 8 Χρόνια 9 Μήνες πριν #3012

  • myle
  • Το Άβαταρ του/της myle
  • Αποσυνδεμένος
  • Admin
  • Δημοσιεύσεις: 467
  • Ληφθείσες Ευχαριστίες 15
Γεια και πάλι,

καλή προσπάθεια και μάλιστα για τόσο σύντομα! Προσπαθώντας, σιγά σιγά θα βρεις τρόπους να γράφεις πιο απλά αυτό που θέλεις να κάνεις. Παραθέτω τον κώδικα με κάποιες διορθώσεις στο τέλος του ποστ.

Προσπαθώντας να κάνω τον κώδικα που έγραψες να τρέξει στο απλό παράδειγμα ορισμένων αρχείων με κείμενο σε ascii, έκανα ορισμένες απλοποιήσεις. Πιστεύω δεν έτρεχε γιατί δε χρησιμοποιώ Windows. Δυστυχώς πια δε θυμάμαι ποιο είναι το σφάλμα που αντιμετώπιζα, αλλά το έτρεχα κάπως έτσι:

Συμπίεση:
python zipper.py -zip asdf /tmp/1.txt /tmp/2.txt IMG_2259.JPG

Αποσυμπίεση:
python zipper.py -unzip asdf

Νομίζω πως το θέμα που αντιμετώπιζες ήταν πως άνοιγες το ίδιο αρχείο με δυο τρόπους. Μια ως αρχείο κειμένου και μια ως δυαδικό αρχείο. Μιας και μιλάμε για το ίδιο αρχείο, καλό είναι να αποφασίσεις έναν τρόπο με τον οποίο το ανοίγεις.

Μερικές μικρές παρατηρήσεις:
  • pass: Δε κάνει τίποτα ως δήλωση. Συνήθως το χρησιμοποιούμε όταν θέλουμε να ορίσουμε ένα κενό μπλοκ. Αν ήδη έχουμε γράψει κάτι άλλο, τότε δε χρειάζεται.
  • εξαιρέσεις: Καλό είναι να ονοματίζεις τον τύπο των εξαιρέσεων που χρησιμοποιείς.
  • αρχεία: Το να χειρίζεσαι αρχεία είναι αρκετά κοστοβόρο.

Κάποια πράγματα στην υλοποίηση δεν είναι πολύ αποδοτικά, αλλά δε νομίζω πως έχει μεγάλη σημασία για τον πειραματικό σκοπό σου.

Ο κώδικας:
# -*- coding: utf-8 -*-
 
#FileName   : zipper.py
#Programmer : Nick Bampaliaris
 
import sys, os
 
running = True
 
def main(argv):
    listOfFiles = []
 
    #Missing options.
    if ( len(argv) < 2):
        print("You must give an option(-zip or -unzip).")
        print("Syntax: -option filename listOfFiles\n\n")
        sys.exit()
 
    #Missing filename.
    elif (len(argv) < 3):
        print("You must give the name of the file.\n")
        print("Syntax: -option filename listOfFiles\n\n")
        sys.exit()
 
 
    #Collecting the filenames from the input.
    for i in range(3, len(argv)):
        listOfFiles.append(argv[i])
 
    #Take the size fo the files.
    sizes = findFileSize(listOfFiles)
 
 
    #Zip the Files.
    if (argv[1] == "-zip"):
        createZipFile(argv[2], listOfFiles, sizes)
 
 
    #Unzip File.
    elif (argv[1] == "-unzip"):
        unzipFile(argv[2])
 
 
    #Uknown option.
    else:
        print("Uknown option: \""+argv[1]+"\"\n\n")
        sys.exit()
 
def createZipFile(zipName, filenames, sizes):
 
    zipfile = open(zipName, "wb")
 
    #------------------------Creating the Header------------------------#
    zipfile.write("<Header>\n") #Start header.
 
    #Writting the headLines.
    for i in range(0, len(filenames)):
        # Replace spaces with underscore.
        string = filenames[i].replace(" ", "_")
 
        #Write the header.
        zipfile.write(nameFromPath(string)+" "+str(sizes[i])+"\n")
 
    zipfile.write("</Header>\n") #Close header.
    #------------------------Creating the Header------------------------#
 
 
 
    #------------------Writting the bytes of the files------------------#
    for filename in filenames:
	file = open(filename, "rb")
        zipfile.write(file.read())
        file.close()
 
    zipfile.close()
    #------------------Writting the bytes of the files------------------#
 
 
def unzipFile(filename):
    filenames  = []
    sizes      = []
    headerSize = 0
 
    #Trying to open the file.
    file = open(filename, "rb")
 
    #-------------Taking info from the Header-------------#
    while (running):
 
        name = ''
        size = ''
 
        string = file.readline() #Reading a line.
        headerSize += len(list(string)) #Taking the amount of bytes of the line.
 
 
        #End of header.
        if (string == "</Header>\n"):
            break
 
        #Recover information.
        elif(string != "<Header>\n"):
 
            lstring = list(string) #make list from the string.
 
            #-----Recovering the name of the file-----#
            while (running):
 
                if (lstring[0] != ' '):
                    name += lstring[0]
                    lstring.remove(lstring[0])
                    pass
 
                else:
                    break
            #-----Recovering the name of the file-----#
 
 
            #-----Recovering the size of the file-----#
            for i in range(1, len(lstring)):
                if (lstring[i] != '\n'):
                    size += lstring[i]
                else:
                    break
            #-----Recovering the size of the file-----#
 
            filenames.append(name) #Append name.
            sizes.append(int(size))#Append size.
    #-------------Taking info from the Header-------------#
 
    #print "Debug", str(filenames)
    #print "Debug", str(sizes)
    contents = file.read().split("</Header>")[-1]
    file.close() #Closing the file.
 
    start = 0
    for i in range(0, len(sizes)):
        newFile = open(filenames[i], "wb")
        filesize = sizes[i]
        newFile.write(contents[start : start + filesize])
        start += sizes[i]
        newFile.close()
 
 
def findFileSize(filenames):
    sizes = []
 
    for filename in filenames:
        #Trying to open the file.
        try:
            file = open(filename, "r")
            size = os.path.getsize(filename)
            sizes.append(size)
            file.close()
            pass
 
 
        #Failed to open.
        except IOError as e:
            print("The file \""+filename+"\" could not been opened.\n")
            sys.exit()
 
    return sizes
 
 
#Επιστρέφει το όνομα ενός αρχείου από το path.
#Δηλαδή αν path = "c:\downloads\file.txt" τότε θα
#επιστρέψει "file.txt"
def nameFromPath(path):
    return os.path.basename(path)
 
 
if (__name__ == "__main__"):
    main(sys.argv)
«Αν υποθέσουμε ότι αυτό είναι δυνατό, (να μεταδώσουμε τη σοφία παντού) τότε ειλικρινά ο τρόπος ζωής των θεών θα περάσει στους ανθρώπους. Τα πάντα θα είναι γεμάτα...
Τελευταία διόρθωση: 8 Χρόνια 9 Μήνες πριν από myle.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Εύρεση string σε αρχείο. 8 Χρόνια 9 Μήνες πριν #3013

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
myle σε ευχαριστώ πάρα πολύ!!! Τα κατάφερα! Άλλαξα τον κωδικά μου έκανα κάποιες βελτιώσεις όπως να ανοίγει τα αρχεία μόνο σε binary mode και δούλεψε. Δοκίμασα να συμπιέσω και να
αποσυμπιέσω δύο τραγούδια και τα αρχεία που δημιουργήθηκαν στην αποσυμπίεση δούλευαν κανονικά
χωρίς να με πετάει μήνυμα ο music player ότι το αρχείο είναι κατεστραμμένο(Που σημαίνει ότι τα bytes των αρχείων γράφονται σωστά χωρίς να έχει γίνει κάνα λάθος χάνοντας κάποια πληροφορία.)

Είμαι πολύ χαρούμενος επειδή κατάφερα να αναπτύξω λίγο τις ικανότητες μου στον προγραμματισμό μιας και κατάφερα να λύσω ένα αρκετά περίπλοκο πρόβλημα. Επίσης αυτόν
τον τρόπο τον σκέφτηκα εντελώς μόνος μια φορά που προσπαθούσα να κοιμηθώ :P
δεν τον είδα πουθενά!!!

Έχω όμως ακόμα μια μικρή αποριούλα :cheer:

Όταν γράφω ένα string σε binary mode με αυτόν τον τρόπο
file.write( str.encode("This is a line \r\n") )
γιατί πρέπει να βάλω και το \r αλλά όχι μόνο το \n για να αλλάξω
γραμμή;;;;; Στην αρχή έβαζα μόνο το \n και δεν δούλευε, αλλά τελικά βρήκα αυτήν την μέθοδο
στο ιντερνετ.

Να και ο νέος μου κώδικας:
# -*- coding: utf-8 -*-
 
 
#FileName : zipper.py
#Developer: Nikolaos Bampaliaris
#Year     : 2015
 
 
import os, sys
 
 
def main(argv):
 
    #Missing option.
    if len(argv) < 2:
        print("You have to add an option(-zip or -unzip).\n")
        sys.exit()
 
 
    #Option is -zip.
    elif argv[1] == "-zip":
 
        #Syntax error.
        if len(argv) < 4:
            print("Sytnax Errorn\nSyntax: -zip  -filename  fileList\n\n")
            sys.exit()
 
        #Missing filename option.
        if "-" not in argv[2]:
            print("You must add the filename option. \n\n")
            sys.exit()
 
        #No syntax error.
        else:
 
            #----Taking the filenames from the input----#
            filenames = []
 
            for i in range(3, len(argv)):
                filenames.append(argv[i])
 
            #----Taking the filenames from the input----#
 
            #Checking and taking the size of the files.
            sizes = checkFiles(filenames)
 
            #Create the zip file.
            zipFiles(filenames, sizes, argv[2])
 
 
    #Option is -unzip.
    elif argv[1] == "-unzip":
 
        #Syntax error.
        if len(argv) < 3:
            print("Syntax Error!\nSyntax: -unzip  zipFile\n\n")
            sys.exit()
 
        #No syntax error.
        else:
            unzipFiles(argv[2])
 
 
    #Uknown option.
    else:
        print("Uknown option: \""+argv[1]+"\".\n")
        sys.exit()
 
 
 
def checkFiles(fileNames):
 
    filesSize = [] #List Of Files Size.
 
    #Looping through the fileNames.
    for filename in fileNames:
 
        #See if the file exists.
        try:
            file = open(filename, "rb")
            filesSize.append(os.path.getsize(filename)) #Append the size of the current file.
            file.close()
 
        #The file could not been opened.
        except:
            print("The file: \""+filename+"\", could not been opened!\n\n")
            sys.exit()
 
 
    #Return the files size.
    return filesSize
 
 
 
 
def getNameFromPath(path):
 
    name = ""
    listedPath = list(path)
    count = 0
 
    #----Looping through the path characters----#
    for char in listedPath:
 
        if char == "/" or char == "\\":
            count += 1
    #----Looping through the path characters----#
 
    #The path is already just the file name.
    if count == 0:
        return path
 
 
    #----Looping whil count is more than zero----#
    while count > 0:
 
        #This will break the loop eventually.
        if listedPath[0] == "/" or listedPath[0] == "\\":
            count -= 1
 
        #Removing the first item from the list.
        listedPath.remove(listedPath[0])
    #----Looping whil count is more than zero----#
 
 
    #----Looping through the path characters----#
    for char in listedPath:
 
        name += char #Creatting the name.
    #----Looping through the path characters----#
 
 
    #Return the name.
    return name
 
 
 
def zipFiles(filenames, sizes, zipFileName):
 
    #Removing the - character from the zipFileName#
    zipFileName = list(zipFileName)
    zipFileName.remove(zipFileName[0])
 
    zip_File_Name = ""
 
    for char in zipFileName:
        zip_File_Name += char
    #Removing the - character from the zipFileName#
 
    zipFile = open(zip_File_Name, "wb") #Opening a file to write bytes on it.
    headerSize = 0
 
    #----------Creating the header of the file----------#
    for i in range(0, len(sizes)):
        headerSize += zipFile.write(str.encode( getNameFromPath(filenames[i])+"="+str(sizes[i])+"\r\n" ) )
    zipFile.write(str.encode("</Header>\r\n"))
    #----------Creating the header of the file----------#
 
 
 
    #----------Writing the bytes from the files into the zip file----------#
    for i in range(0, len(sizes)):
 
        #Trying to open the current file.
        try:
            file = open(filenames[i], "rb")
            zipFile.write(file.read())
            file.close()
 
 
        #Problem in opening the file.
        except:
            print("File: \""+filenames[i]+"\" could not been opened.\n\n")
            system.exit()
 
    #----------Writing the bytes from the files into the zip file----------#
 
    zipFile.close()
 
    print("The files have been zipped successfully!\n\n")
 
 
 
 
 
def unzipFiles(zipFileName):
 
    filenames = []
    sizes     = []
 
    zipFile = open(zipFileName, "rb") #Opening the file.
 
    next_line = bytes.decode(zipFile.readline()) #Reading the very first line.
 
 
    #----------Recovering the headers information----------#
    while next_line != "</Header>\r\n":
 
        name = ""
        size = ""
 
        listedNextLine = list(next_line) #Listing the line.
 
        #----Recovering the filename in the current line----#
        while listedNextLine[0] != "=":
            name += listedNextLine[0]
            listedNextLine.remove(listedNextLine[0])
        #----Recovering the filename in the current line----#
 
 
        #----Recovering the filesize in the current line----#
        for i in range(1, len(listedNextLine)):
 
            if listedNextLine[i] != "\r":
                size += listedNextLine[i]
 
            else:
                break
        #----Recovering the filesize in the current line----#
 
 
        filenames.append(name)      #Appending the filename of the current line.
        sizes.append(int(size))     #Appending the size of the file in the current line.
 
        next_line = bytes.decode(zipFile.readline()) #Reading the next line.
    #----------Recovering the headers information----------#
 
 
    #------------------Creating the files------------------#
    for i in range(0, len(sizes)):
 
        file = open(filenames[i], "wb")
 
        while sizes[i] > 0:
 
            file.write(zipFile.read(1))
            sizes[i] -= 1
 
        file.close()
    #------------------Creating the files------------------#
 
 
    zipFile.close()
 
    print("The files have been unzipped successfully!\n\n")
 
 
#Starting the program.
if (__name__ == "__main__"):
    main(sys.argv)
 
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Εύρεση string σε αρχείο. 8 Χρόνια 9 Μήνες πριν #3015

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
Όταν γράφω ένα string σε binary mode με αυτόν τον τρόπο

file.write( str.encode("This is a line \r\n") )

γιατί πρέπει να βάλω και το \r αλλά όχι μόνο το \n για να αλλάξω
γραμμή;;;;; Στην αρχή έβαζα μόνο το \n και δεν δούλευε, αλλά τελικά βρήκα αυτήν την μέθοδο
στο ιντερνετ.

Οι συγκεκριμένοι χαρακτήρες, είναι χαρακτήρες αλλαγής γραμμής, για το λειτουργικό windows.
Για linux, είναι "\n" και για λειτουργικά της apple είναι το "\r".

Για να μην παιδεύεσαι με αυτά και να γνωρίζεις ποιος είναι ο χαρακτήρας αλλαγής γραμμής, υπάρχει η εντολή linesep του πακέτου os.

>>> import os
>>> os.linesep
'\n'
Γράφω σε Python 3
Τελευταία διόρθωση: 8 Χρόνια 9 Μήνες πριν από kamar. Αιτία: Διόρθωση κώδικα
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Εύρεση string σε αρχείο. 8 Χρόνια 9 Μήνες πριν #3019

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Τώρα να φανταστώ για να κάνω ένα πρόγραμμα συμπίεσης που να μικραίνει και το μέγεθος των αρχείων πρέπει να είναι τρομερά δύσκολο. Δεν μπορώ καν να σκεφτώ πως να κάνω κάτι τέτοιο :P
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Εύρεση string σε αρχείο. 8 Χρόνια 9 Μήνες πριν #3031

  • myle
  • Το Άβαταρ του/της myle
  • Αποσυνδεμένος
  • Admin
  • Δημοσιεύσεις: 467
  • Ληφθείσες Ευχαριστίες 15
Είναι σίγουρα κάπως πιο περίπλοκο.

Ο πιο απλός ίσως τρόπος είναι ο run length encoding. Πχ το 00000111 το λές: πέντε 0 τρια 1. Το θέμα είναι πως αναπαριστάς το "πέντε" και πως το "5" ώστε να τα ξεχωρίζεις. Η συνήθης λύση είναι το "πέντε" αναπαρίσταται στο μοναδικό σύστημα (χρησιμοποιείς τόσες μονάδες όσο είναι και το μέγεθος του αριθμου, δλδ 11 = 2, 11111 = 5 κοκ) και το 5 το αναπαριστάς στο δυαδικό (δλδ 101).

Ένας λίγο πιο περίπλοκος, αλλά και πάλι αρκετά απλός είναι το Huffman coding. Ουσιαστικά τα πιο συχνά σύμβολα τα αναπαριστάς με λιγότερα ψηφία και τα πιο σπάνια με περισσότερα. Έτσι, πιο συχνά θα γράφεις λιγότερο. Υπάρχουν κάποιες ιδιότητες που πρέπει να τηρούνται (όχι ίδιο πρόθεμα), οπότε καταλήγεις να φτιάχνεις κάτι σαν ένα μικρό δέντρο.

Μπορείς να βρεις λεπτομέρειες στη Wikipedia.

Αν σου αρέσουν πιο extreme πράγματα, είμαι σίγουρος εύκολα θα βρεις πιο περίπλοκους αλγορίθμους. Από τους αγαπημένους μου (που όμως δεν κάνει συμπίεση, αλλά είναι χρήσιμο ως βήμα πριν τη συμπίεση) είναι ο μετασχηματισμός Burrows-Wheeler.
«Αν υποθέσουμε ότι αυτό είναι δυνατό, (να μεταδώσουμε τη σοφία παντού) τότε ειλικρινά ο τρόπος ζωής των θεών θα περάσει στους ανθρώπους. Τα πάντα θα είναι γεμάτα...
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Εύρεση string σε αρχείο. 8 Χρόνια 9 Μήνες πριν #3032

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
myle έγραψε:
Είναι σίγουρα κάπως πιο περίπλοκο.

Ο πιο απλός ίσως τρόπος είναι ο run length encoding. Πχ το 00000111 το λές: πέντε 0 τρια 1. Το θέμα είναι πως αναπαριστάς το "πέντε" και πως το "5" ώστε να τα ξεχωρίζεις. Η συνήθης λύση είναι το "πέντε" αναπαρίσταται στο μοναδικό σύστημα (χρησιμοποιείς τόσες μονάδες όσο είναι και το μέγεθος του αριθμου, δλδ 11 = 2, 11111 = 5 κοκ) και το 5 το αναπαριστάς στο δυαδικό (δλδ 101).

Ένας λίγο πιο περίπλοκος, αλλά και πάλι αρκετά απλός είναι το Huffman coding. Ουσιαστικά τα πιο συχνά σύμβολα τα αναπαριστάς με λιγότερα ψηφία και τα πιο σπάνια με περισσότερα. Έτσι, πιο συχνά θα γράφεις λιγότερο. Υπάρχουν κάποιες ιδιότητες που πρέπει να τηρούνται (όχι ίδιο πρόθεμα), οπότε καταλήγεις να φτιάχνεις κάτι σαν ένα μικρό δέντρο.

Μπορείς να βρεις λεπτομέρειες στη Wikipedia.

Αν σου αρέσουν πιο extreme πράγματα, είμαι σίγουρος εύκολα θα βρεις πιο περίπλοκους αλγορίθμους. Από τους αγαπημένους μου (που όμως δεν κάνει συμπίεση, αλλά είναι χρήσιμο ως βήμα πριν τη συμπίεση) είναι ο μετασχηματισμός Burrows-Wheeler.

Καλύτερα να περιμένω να μας τα πουν στην σχολή λολ :P Δεν πολύ ξέρω από δυαδικούς αριθμούς, θα μπερδευτώ άμα το ψάξω.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Εύρεση string σε αρχείο. 8 Χρόνια 9 Μήνες πριν #3046

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
babaliaris1 έγραψε:
myle έγραψε:
Είναι σίγουρα κάπως πιο περίπλοκο.

Ο πιο απλός ίσως τρόπος είναι ο run length encoding. Πχ το 00000111 το λές: πέντε 0 τρια 1. Το θέμα είναι πως αναπαριστάς το "πέντε" και πως το "5" ώστε να τα ξεχωρίζεις. Η συνήθης λύση είναι το "πέντε" αναπαρίσταται στο μοναδικό σύστημα (χρησιμοποιείς τόσες μονάδες όσο είναι και το μέγεθος του αριθμου, δλδ 11 = 2, 11111 = 5 κοκ) και το 5 το αναπαριστάς στο δυαδικό (δλδ 101).

Ένας λίγο πιο περίπλοκος, αλλά και πάλι αρκετά απλός είναι το Huffman coding. Ουσιαστικά τα πιο συχνά σύμβολα τα αναπαριστάς με λιγότερα ψηφία και τα πιο σπάνια με περισσότερα. Έτσι, πιο συχνά θα γράφεις λιγότερο. Υπάρχουν κάποιες ιδιότητες που πρέπει να τηρούνται (όχι ίδιο πρόθεμα), οπότε καταλήγεις να φτιάχνεις κάτι σαν ένα μικρό δέντρο.

Μπορείς να βρεις λεπτομέρειες στη Wikipedia.

Αν σου αρέσουν πιο extreme πράγματα, είμαι σίγουρος εύκολα θα βρεις πιο περίπλοκους αλγορίθμους. Από τους αγαπημένους μου (που όμως δεν κάνει συμπίεση, αλλά είναι χρήσιμο ως βήμα πριν τη συμπίεση) είναι ο μετασχηματισμός Burrows-Wheeler.

Καλύτερα να περιμένω να μας τα πουν στην σχολή λολ :P Δεν πολύ ξέρω από δυαδικούς αριθμούς, θα μπερδευτώ άμα το ψάξω.

Βέβαια σαν άσκηση είναι καλό.
Όμως, αφού στην Python υπάρχει ήδη έτοιμη βιβλιοθήκη συμπίεσης, καλό θα ήταν να χρησιμοποιείς αυτήν. Γιατί να εφεύρεις ξανά τον τροχό;
Γράφω σε Python 3
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Εύρεση string σε αρχείο. 8 Χρόνια 9 Μήνες πριν #3047

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
kamar έγραψε:
Βέβαια σαν άσκηση είναι καλό.
Όμως, αφού στην Python υπάρχει ήδη έτοιμη βιβλιοθήκη συμπίεσης, καλό θα ήταν να χρησιμοποιείς αυτήν. Γιατί να εφεύρεις ξανά τον τροχό;

Ναι όπως είπες για εξάσκηση το έκανα :P
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.590 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου