newbie: write content in a file (server-side)

Discussion in 'Python' started by Thomas Kaufmann, Jul 29, 2012.

  1. Hi,

    I send from a client file content to my server (as bytes). So far so good.
    The server receives this content complete. Ok. Then I want to write this content to a new file. It works too. But in the new file are only the first part of the whole content.

    What's the problem.

    o-o

    Thomas

    Here's my server code:



    import socketserver

    class MyTCPServer(socketserver.BaseRequestHandler):

    def handle(self):

    s = ''
    li = []
    addr = self.client_address[0]
    print("[{}] Connected! ".format(addr))
    while True:

    bytes = self.request.recv(4096)
    if bytes:
    s = bytes.decode("utf8")
    print(s)
    li = s.split("~")
    with open(li[0], 'w') as fp:
    fp.write(li[1])

    #... main ......................................................

    if __name__ == "__main__":

    server = socketserver.ThreadingTCPServer(("", 12345), MyTCPServer)
    server.serve_forever()
    Thomas Kaufmann, Jul 29, 2012
    #1
    1. Advertising

  2. Thomas Kaufmann

    Peter Otten Guest

    Thomas Kaufmann wrote:

    > I send from a client file content to my server (as bytes). So far so good.
    > The server receives this content complete. Ok. Then I want to write this
    > content to a new file. It works too. But in the new file are only the
    > first part of the whole content.
    >
    > What's the problem.


    > Here's my server code:


    > while True:
    > bytes = self.request.recv(4096)
    > if bytes:
    > s = bytes.decode("utf8")
    > print(s)
    > li = s.split("~")
    > with open(li[0], 'w') as fp:
    > fp.write(li[1])


    - Do you ever want to leave the loop?

    - You calculate a new filename on every iteration of the while loop --
    probably not what you intended to do.

    - The "w" argument tells Python to overwrite the file if it exists. You
    either need to keep the file open (move the with... out of the loop) or open
    it with "a".

    - You may not receive the complete file name on the first iteration of the
    while loop.

    - The bytes buffer can contain incomplete characters, e. g.:

    >>> data = b"\xc3\xa4"
    >>> data.decode("utf-8")

    'ä'
    >>> data[:1].decode("utf-8")

    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 0:
    unexpected end of data
    Peter Otten, Jul 29, 2012
    #2
    1. Advertising

  3. Am Sonntag, 29. Juli 2012 17:16:11 UTC+2 schrieb Peter Otten:
    > Thomas Kaufmann wrote:
    >
    >
    >
    > > I send from a client file content to my server (as bytes). So far so good.

    >
    > > The server receives this content complete. Ok. Then I want to write this

    >
    > > content to a new file. It works too. But in the new file are only the

    >
    > > first part of the whole content.

    >
    > >

    >
    > > What's the problem.

    >
    >
    >
    > > Here's my server code:

    >
    >
    >
    > > while True:

    >
    > > bytes = self.request.recv(4096)

    >
    > > if bytes:

    >
    > > s = bytes.decode("utf8")

    >
    > > print(s)

    >
    > > li = s.split("~")

    >
    > > with open(li[0], 'w') as fp:

    >
    > > fp.write(li[1])

    >
    >
    >
    > - Do you ever want to leave the loop?
    >
    >
    >
    > - You calculate a new filename on every iteration of the while loop --
    >
    > probably not what you intended to do.
    >
    >
    >
    > - The "w" argument tells Python to overwrite the file if it exists. You
    >
    > either need to keep the file open (move the with... out of the loop) or open
    >
    > it with "a".
    >
    >
    >
    > - You may not receive the complete file name on the first iteration of the
    >
    > while loop.
    >
    >
    >
    > - The bytes buffer can contain incomplete characters, e. g.:
    >
    >
    >
    > >>> data = b"\xc3\xa4"

    >
    > >>> data.decode("utf-8")

    >
    > 'ä'
    >
    > >>> data[:1].decode("utf-8")

    >
    > Traceback (most recent call last):
    >
    > File "<stdin>", line 1, in <module>
    >
    > UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 0:
    >
    > unexpected end of data



    Thanks Peter. It helps;-).
    Thomas Kaufmann, Jul 30, 2012
    #3
  4. Am Sonntag, 29. Juli 2012 17:16:11 UTC+2 schrieb Peter Otten:
    > Thomas Kaufmann wrote:
    >
    >
    >
    > > I send from a client file content to my server (as bytes). So far so good.

    >
    > > The server receives this content complete. Ok. Then I want to write this

    >
    > > content to a new file. It works too. But in the new file are only the

    >
    > > first part of the whole content.

    >
    > >

    >
    > > What's the problem.

    >
    >
    >
    > > Here's my server code:

    >
    >
    >
    > > while True:

    >
    > > bytes = self.request.recv(4096)

    >
    > > if bytes:

    >
    > > s = bytes.decode("utf8")

    >
    > > print(s)

    >
    > > li = s.split("~")

    >
    > > with open(li[0], 'w') as fp:

    >
    > > fp.write(li[1])

    >
    >
    >
    > - Do you ever want to leave the loop?
    >
    >
    >
    > - You calculate a new filename on every iteration of the while loop --
    >
    > probably not what you intended to do.
    >
    >
    >
    > - The "w" argument tells Python to overwrite the file if it exists. You
    >
    > either need to keep the file open (move the with... out of the loop) or open
    >
    > it with "a".
    >
    >
    >
    > - You may not receive the complete file name on the first iteration of the
    >
    > while loop.
    >
    >
    >
    > - The bytes buffer can contain incomplete characters, e. g.:
    >
    >
    >
    > >>> data = b"\xc3\xa4"

    >
    > >>> data.decode("utf-8")

    >
    > 'ä'
    >
    > >>> data[:1].decode("utf-8")

    >
    > Traceback (most recent call last):
    >
    > File "<stdin>", line 1, in <module>
    >
    > UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 0:
    >
    > unexpected end of data



    Thanks Peter. It helps;-).
    Thomas Kaufmann, Jul 30, 2012
    #4
  5. Am Sonntag, 29. Juli 2012 16:16:01 UTC+2 schrieb Thomas Kaufmann:
    > Hi,
    >
    >
    >
    > I send from a client file content to my server (as bytes). So far so good.
    >
    > The server receives this content complete. Ok. Then I want to write this content to a new file. It works too. But in the new file are only the first part of the whole content.
    >
    >
    >
    > What's the problem.
    >
    >
    >
    > o-o
    >
    >
    >
    > Thomas
    >
    >
    >
    > Here's my server code:
    >
    >
    >
    >
    >
    >
    >
    > import socketserver
    >
    >
    >
    > class MyTCPServer(socketserver.BaseRequestHandler):
    >
    >
    >
    > def handle(self):
    >
    >
    >
    > s = ''
    >
    > li = []
    >
    > addr = self.client_address[0]
    >
    > print("[{}] Connected! ".format(addr))
    >
    > while True:
    >
    >
    >
    > bytes = self.request.recv(4096)
    >
    > if bytes:
    >
    > s = bytes.decode("utf8")
    >
    > print(s)
    >
    > li = s.split("~")
    >
    > with open(li[0], 'w') as fp:
    >
    > fp.write(li[1])
    >
    >
    >
    > #... main ......................................................
    >
    >
    >
    > if __name__ == "__main__":
    >
    >
    >
    > server = socketserver.ThreadingTCPServer(("", 12345), MyTCPServer)
    >
    > server.serve_forever()



    Thanks a lot. It helps.
    Thomas Kaufmann, Jul 30, 2012
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.

Share This Page