Я ищу, чтобы разобрать (несколько) файлов цепочки .dat из указанной папки в сценарий Python. Цель состоит в том, чтобы распечатать каждую транзакцию (это временно, план состоит в том, чтобы записать удобочитаемые значения в базу данных). Я могу отправить ссылку на гист, если нужна дополнительная информация.

def parseBlockFile(self, blockfile):
      print 'Parsing block file: %s\n' % blockfile
      with open(blockfile, 'rb') as bf:
         self.magic_no = read_uint4(bf)
         print 'magic_no:\t0x%8x' % self.magic_no

         self.blocksize = read_uint4(bf)
         print 'size:    \t%u bytes' % self.blocksize

         self.blockheader = BlockHeader()
         self.blockheader.parse(bf)
         print 'Block header:\t%s' % self.blockheader

         self.transaction_cnt = read_varint(bf)
         print 'Transactions: \t%d' % self.transaction_cnt

         self.transactions = []

         print 'List of transactions'
         for i in range(0, self.transaction_cnt):
            tx = Transaction()
            tx.parse(bf)
            self.transactions.append(tx)
            print '='*50
            print ' TX NUMBER: %d' % (i+1)
            print '='*50
            print tx
            print '\n'


def parseBlockFile(blockfile):
    block = Block()
    block.parseBlockFile(blockfile)

if __name__ == "__main__":
    import os  # Open a file
    path = "/Users/user_name/PycharmProjects/block_chain_parse/data/"
    dirs = os.listdir(path)
    # Find each file in the folder
    for file in dirs:
        print file #check the file makes it this far
        parseBlockFile(file) #pass each file

Я получаю следующую ошибку:

blk00000.dat
Parsing block file: blk00000.dat

Traceback (most recent call last):
  File "block.py", line 212, in <module>
    parseBlockFile(file) #pass each file
  File "block.py", line 203, in parseBlockFile
    block.parseBlockFile(blockfile)
  File "block.py", line 173, in parseBlockFile
    with open(blockfile, 'rb') as bf:
IOError: [Errno 2] No such file or directory: 'blk00000.dat'

Любые мысли?

0
user3939059 16 Дек 2015 в 16:18

3 ответа

Лучший ответ

Вы запускаете код из той же директории, что и файлы .dat? Попробуйте добавить путь при вызове parseBlockFile:

if __name__ == "__main__":
    import os  # Open a file
    path = "/Users/user_name/PycharmProjects/block_chain_parse/data/"
    dirs = os.listdir(path)
    # Find each file in the folder
    for file in dirs:
        print file #check the file makes it this far
        parseBlockFile(path+file) #pass each file
0
mgig 16 Дек 2015 в 13:31

os.listdir(path) возвращают имена, а не полные пути

Изменить parseBlockFile(file) на

fullpath = os.path.join(path,file)
if os.path.isfile(fullpath) and fullpath.endswith('.dat'):
  parseBlockFile(fullpath)
0
mugiseyebrows 16 Дек 2015 в 13:34

Вы можете использовать glob, например так:

from glob import glob


if __name__ == "__main__":
    path = "H:/Workspaces_Python/test/"
    files = glob(path + "*.dat")

    for file in files:
        print(file)
        parseBlockFile(file) #pass each file
1
N. Wouda 16 Дек 2015 в 13:39