30/09/2018, 18:05

Lỗi TypeError khi đọc ghi file

Mọi người cho mình hỏi,mình có 1 cái function như ở dưới nhưng nó không chạy được.Cho hỏi cần sửa thế nào.

def pretty_printing(dict):
    infile = open(file,"r")
    outfile = open("example.txt","w")

    order_keys = dict.keys()
    order_keys.sort()


    for key in order_keys:
        print key, dict[key]
    outfile.close()
    infile.close()
#test
a_file=raw_input("enter your file:")
pretty_printing(a_file)
K Tiger viết 20:12 ngày 30/09/2018

có ai có cách fix ko

Mai Anh Dũng viết 20:17 ngày 30/09/2018

Thông báo lỗi gì nhỉ? Câu hỏi này mơ hồ quá.

K Tiger viết 20:21 ngày 30/09/2018

nó nói:infile = open(file,“r”)
TypeError: coercing to Unicode: need string or buffer, type found

htl@PyMI.vn viết 20:13 ngày 30/09/2018

Hàm của bạn đặt tham số là dict nhuwngbeen trong bạn dùng tham số file. Nó báo lỗi là đúng rồi. Sửa file thành dict nhé
Ah, tuy nhiên cả dictfile đều là từ khóa của python, giống như def vậy. Nên bạn chọn tên tham số khác nhé. filename chẳng hạn, code cũng dễ hiểu hơn

K Tiger viết 20:16 ngày 30/09/2018

mình sửa lại như vầy,nó có tạo ra file example.txt mà không có gì ở trong hết,nó báo:‘str’ object has no attribute ‘keys’

def pretty_printing(file_name):
    infile = open(file_name,"r")
    outfile = open("example.txt","w")

    order_keys = file_name.keys()
    order_keys.sort()


    for key in order_keys:
        print key, dict[key]
    outfile.close()
    infile.close()
htl@PyMI.vn viết 20:12 ngày 30/09/2018

Bạn xem bài này nhé

Thông báo lỗi đầy đủ là như này: D:\HTL\Desktop>python test.py Traceback (most recent call last): File "test.py", line 14, in <module> nice_printing('text.txt') File "test.py", line 8, in nice_printing value = line.split(': ')[1] IndexError: list index out of range Bạn đã đọc link mình gửi và thử áp dụng nó chưa? Thôi để mình sửa luôn hộ nhé. Vì file của bạn chỉ có 1 dòng nên có thể dùng read() outfile chưa dùng nên mình bỏ đi import ast def nice_printing(a_string): i…

K Tiger viết 20:20 ngày 30/09/2018

đoạn code của bài đó là là chỉ đọc file của user xong print thẳng ra đúng không bạn, còn mình cần nó in vào trong 1 cái file khác, vs lại mình cũng chưa học cái import ast nên không dung dc.

htl@PyMI.vn viết 20:18 ngày 30/09/2018

Đoạn print đó chỉ để biết dữ liệu mình lấy được là loại gì.
Việc ghi ra file ko có gì khó.
Khi đọc file thì sau khi open bạn phải read() để lấy dữ liệu ở dạng str. Sau đó dùng thao tác với string, vd string[1:-2] để loại bỏ dấu { } ở đầu và cuối. Sau đó split(', ') để tách từng item trong string, sau đó split tiếp. Đó là cách thủ công. Còn cách nhanh thì dùng module ast như mình dùng. Quan trọng là bạn hiểu cách làm, dùng công cụ gì chả được, miễn là nhanh, cần gì phải đi đường vòng

K Tiger viết 20:13 ngày 30/09/2018

cái chỗ string[1:-2] là mình ghi for key,value in new_file[1:-2] hả bạn?

htl@PyMI.vn viết 20:14 ngày 30/09/2018
def nice_printing(a_string):
    infile = open(a_string, 'r')
    data = infile.read()
    print(data)
    items = data[1:-2].split(', ')
    print(items)
    for item in items:
        key = item.split(':')[0][1:-1]
        value = item.split(':')[1]
        print(key, value)
    infile.close()

nice_printing('text.txt')

Kết quả:

{'a':1, 'b':2}

["'a':1", "'b':2"]
a 1
b 2
K Tiger viết 20:13 ngày 30/09/2018

{‘a’:1,‘b’:2}
["‘a’:1,‘b’:"]
(‘a’, “1,‘b’”)
sao nó lại in ra như vầy thay vì ?
a 1
b 2

htl@PyMI.vn viết 20:06 ngày 30/09/2018

Bạn post đầy đủ code và dữ liệu cần xử lý nhé. Dữ liệu khác nhau 1 khoảng trắng thì cách split cungz khác. Bạn đọc hiểu code rồi thì sửa theo dữ liệu của mình, đừng máy móc copy paste.

K Tiger viết 20:20 ngày 30/09/2018

đề là user nhập 1 file chứa text bất kì,chương trình phải đếm số chữ trong file đó vd: I am am–>I 1, am 2.Xong chương trình phải in ra file có tên là example.txt theo dạng l 1(line 1), am 2(line 2). Mình đã làm xong cái function để đếm r còn cái để in ra mà làm hoài ko dc.cái này là phần đã xong

def word_count(a_string):
    infile = open(a_string,"r")
    outfile = open("example.txt","w")
    new_file = infile.read().split()
    string_dict = {}
    for word in new_file:
        string_dict[word] = 0
    for word in new_file:
        if word in string_dict.keys():
            string_dict[word]=string_dict[word]+1

    outfile.write(str(string_dict))

    outfile.close()
    infile.close()
htl@PyMI.vn viết 20:16 ngày 30/09/2018

Đoạn
outfile.write(str(string_dict))
Sửa thành

for key, value in string_dict.items():
  outfile.write(key, value, '\n')
K Tiger viết 20:09 ngày 30/09/2018

sao sửa cái đó lại nó báo function takes exactly 1 argument (3 given), mình nghĩ cái đoạn function của count ổn rồi mà vì run được

htl@PyMI.vn viết 20:15 ngày 30/09/2018

Mình nhầm sang lệnh print
Bạn sửa thành outfile.write(str(key)+str(value)+'\n') nhé

K Tiger viết 20:05 ngày 30/09/2018

nó chạy rồi cảm ơn bạn, nhưng sao nó báo lỗi cái dòng infile = open(a_string, ‘r’) là coercing to Unicode: need string or buffer . Với lại cho mình hỏi nếu mình muốn file xuất ra theo thứ tự abc mình them vào đây nhưng sao không có gì xảy ra hết vậy.

def nice_printing(a_string):
    infile = open(a_string, 'r')
    data = infile.read()
    
    items = data[1:-2].split(', ')
    items.sort()
htl@PyMI.vn viết 20:13 ngày 30/09/2018

Lỗi đó có thể do a_string của bạn ko phải là tên file kiểu string mà là 1 file object
Còn sort thì nó chỉ trả về giá trị thôi, phải gán lại vào items.
items = items.sort()

K Tiger viết 20:07 ngày 30/09/2018

vậy làm sao fix cái a_string được?

htl@PyMI.vn viết 20:06 ngày 30/09/2018

Thì bạn post hết code lên đây, hàm đó đúng rồi thì lúc gọi hàm đó bạn truyền biến nào vào?
Bạn tập thói quen khi hỏi cung cấp càng nhiều thông tin càng tốt, để người khác còn hiểu

Bài liên quan
0