diff --git a/CHANGELOG.md b/CHANGELOG.md
index 47163f3..8566a50 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,6 +16,7 @@ project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
 - Fix escaping of quoted values written by `set_key` (#236 by [@bbc2]).
 - Fix `dotenv run` crashing on environment variables without values (#237 by [@yannham]).
+- Remove warning when last line is empty (#238 by [@bbc2]).
 
 ## [0.11.0] - 2020-02-07
 
diff --git a/src/dotenv/parser.py b/src/dotenv/parser.py
index 2904af8..2c93cbd 100644
--- a/src/dotenv/parser.py
+++ b/src/dotenv/parser.py
@@ -197,6 +197,13 @@ def parse_binding(reader):
     reader.set_mark()
     try:
         reader.read_regex(_multiline_whitespace)
+        if not reader.has_next():
+            return Binding(
+                key=None,
+                value=None,
+                original=reader.get_marked(),
+                error=False,
+            )
         reader.read_regex(_export)
         key = parse_key(reader)
         reader.read_regex(_whitespace)

diff --git a/tests/test_main.py b/tests/test_main.py
index a4fb5b4..d867858 100644
--- a/tests/test_main.py
+++ b/tests/test_main.py
@@ -30,63 +30,32 @@ def test_set_key_no_file(tmp_path):
 
 
 @pytest.mark.parametrize(
-    "key,value,expected,content",
+    "before,key,value,expected,after",
     [
-        ("a", "", (True, "a", ""), 'a=""\n'),
-        ("a", "b", (True, "a", "b"), 'a="b"\n'),
-        ("a", "'b'", (True, "a", "b"), 'a="b"\n'),
-        ("a", "\"b\"", (True, "a", "b"), 'a="b"\n'),
-        ("a", "b'c", (True, "a", "b'c"), 'a="b\'c"\n'),
-        ("a", "b\"c", (True, "a", "b\"c"), 'a="b\\\"c"\n'),
+        ("", "a", "", (True, "a", ""), 'a=""\n'),
+        ("", "a", "b", (True, "a", "b"), 'a="b"\n'),
+        ("", "a", "'b'", (True, "a", "b"), 'a="b"\n'),
+        ("", "a", "\"b\"", (True, "a", "b"), 'a="b"\n'),
+        ("", "a", "b'c", (True, "a", "b'c"), 'a="b\'c"\n'),
+        ("", "a", "b\"c", (True, "a", "b\"c"), 'a="b\\\"c"\n'),
+        ("a=b", "a", "c", (True, "a", "c"), 'a="c"\n'),
+        ("a=b\n", "a", "c", (True, "a", "c"), 'a="c"\n'),
+        ("a=b\n\n", "a", "c", (True, "a", "c"), 'a="c"\n\n'),
+        ("a=b\nc=d", "a", "e", (True, "a", "e"), 'a="e"\nc=d'),
+        ("a=b\nc=d\ne=f", "c", "g", (True, "c", "g"), 'a=b\nc="g"\ne=f'),
+        ("a=b\n", "c", "d", (True, "c", "d"), 'a=b\nc="d"\n'),
     ],
 )
-def test_set_key_new(dotenv_file, key, value, expected, content):
+def test_set_key(dotenv_file, before, key, value, expected, after):
     logger = logging.getLogger("dotenv.main")
+    with open(dotenv_file, "w") as f:
+        f.write(before)
 
     with mock.patch.object(logger, "warning") as mock_warning:
         result = dotenv.set_key(dotenv_file, key, value)
 
     assert result == expected
-    assert open(dotenv_file, "r").read() == content
-    mock_warning.assert_not_called()
-
-
-def test_set_key_new_with_other_values(dotenv_file):
-    logger = logging.getLogger("dotenv.main")
-    with open(dotenv_file, "w") as f:
-        f.write("a=b\n")
-
-    with mock.patch.object(logger, "warning") as mock_warning:
-        result = dotenv.set_key(dotenv_file, "foo", "bar")
-
-    assert result == (True, "foo", "bar")
-    assert open(dotenv_file, "r").read() == 'a=b\nfoo="bar"\n'
-    mock_warning.assert_not_called()
-
-
-def test_set_key_existing(dotenv_file):
-    logger = logging.getLogger("dotenv.main")
-    with open(dotenv_file, "w") as f:
-        f.write("foo=bar")
-
-    with mock.patch.object(logger, "warning") as mock_warning:
-        result = dotenv.set_key(dotenv_file, "foo", "baz")
-
-    assert result == (True, "foo", "baz")
-    assert open(dotenv_file, "r").read() == 'foo="baz"\n'
-    mock_warning.assert_not_called()
-
-
-def test_set_key_existing_with_other_values(dotenv_file):
-    logger = logging.getLogger("dotenv.main")
-    with open(dotenv_file, "w") as f:
-        f.write("a=b\nfoo=bar\nc=d")
-
-    with mock.patch.object(logger, "warning") as mock_warning:
-        result = dotenv.set_key(dotenv_file, "foo", "baz")
-
-    assert result == (True, "foo", "baz")
-    assert open(dotenv_file, "r").read() == 'a=b\nfoo="baz"\nc=d'
+    assert open(dotenv_file, "r").read() == after
     mock_warning.assert_not_called()
 
 
diff --git a/tests/test_parser.py b/tests/test_parser.py
index dae51d3..f807513 100644
--- a/tests/test_parser.py
+++ b/tests/test_parser.py
@@ -86,6 +86,19 @@ from dotenv.parser import Binding, Original, parse_stream
             Binding(key=u"b", value=u'c', original=Original(string=u"b=c", line=2), error=False),
         ]
     ),
+    (
+        u"\n\n",
+        [
+            Binding(key=None, value=None, original=Original(string=u"\n\n", line=1), error=False),
+        ]
+    ),
+    (
+        u"a=b\n\n",
+        [
+            Binding(key=u"a", value=u"b", original=Original(string=u"a=b\n", line=1), error=False),
+            Binding(key=None, value=None, original=Original(string=u"\n", line=2), error=False),
+        ]
+    ),
     (
         u'a=b\n\nc=d',
         [

Python-dotenv could not parse statement
Hi Guys,

I use dotenv in my Django app and ran into one issue when i runserver:

`> Python-dotenv could not parse statement starting at line 10`

although the django seem working fine, but I couldn't feel right about this.

Here is my .env file:
```
DJANGO_SECRET_KEY="xxxxxxxxxxxxxxxxx"
DEBUG=True
DATABASE_DEFAULT_ENGINE="django.db.backends.postgresql"
DATABASE_DEFAULT_NAME="postgres"
DATABASE_DEFAULT_USER="postgres"
DATABASE_DEFAULT_PASSWORD="abc123"
DATABASE_DEFAULT_HOST="localhost"
DATABASE_DEFAULT_PORT="5432"
SENDGRID_API_KEY="xxxxxxxxxxxxxxxxxxxxxxxx"
```
And i have load the dotenv in wsgi.py:
```
import os

from dotenv import load_dotenv

from django.core.wsgi import get_wsgi_application

load_dotenv()

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webapp.settings')

application = get_wsgi_application()
```

and i even done it in manage.py:
```
import os
import sys

from pathlib import Path

from dotenv import load_dotenv

env_path = Path('webapp') / '.env'
load_dotenv(dotenv_path=env_path)
... the rest as usual
```

is this a bug or my own mistakes?


tests/test_main.py::test_set_key[a=b\n\n-a-c-expected8-a="c"\n\n] tests/test_parser.py::test_parse_stream[\n\n-expected30] tests/test_parser.py::test_parse_stream[a=b\n\n-expected31]
tests/test_main.py::test_set_key_no_file tests/test_main.py::test_set_key[-a--expected0-a=""\n] tests/test_main.py::test_set_key[-a-b-expected1-a="b"\n] tests/test_main.py::test_set_key[-a-'b'-expected2-a="b"\n] tests/test_main.py::test_set_key[-a-"b"-expected3-a="b"\n] tests/test_main.py::test_set_key[-a-b'c-expected4-a="b'c"\n] tests/test_main.py::test_set_key[-a-b"c-expected5-a="b\\"c"\n] tests/test_main.py::test_set_key[a=b-a-c-expected6-a="c"\n] tests/test_main.py::test_set_key[a=b\n-a-c-expected7-a="c"\n] tests/test_main.py::test_set_key[a=b\nc=d-a-e-expected9-a="e"\nc=d] tests/test_main.py::test_set_key[a=b\nc=d\ne=f-c-g-expected10-a=b\nc="g"\ne=f] tests/test_main.py::test_set_key[a=b\n-c-d-expected11-a=b\nc="d"\n] tests/test_main.py::test_get_key_no_file tests/test_main.py::test_get_key_not_found tests/test_main.py::test_get_key_ok tests/test_main.py::test_get_key_none tests/test_main.py::test_unset_with_value tests/test_main.py::test_unset_no_value tests/test_main.py::test_unset_non_existent_file tests/test_main.py::test_find_dotenv_no_file_raise tests/test_main.py::test_find_dotenv_no_file_no_raise tests/test_main.py::test_find_dotenv_found tests/test_main.py::test_load_dotenv_existing_file tests/test_main.py::test_load_dotenv_no_file_verbose tests/test_main.py::test_load_dotenv_existing_variable_no_override tests/test_main.py::test_load_dotenv_existing_variable_override tests/test_main.py::test_load_dotenv_utf_8 tests/test_main.py::test_load_dotenv_in_current_dir tests/test_main.py::test_dotenv_values_file tests/test_main.py::test_dotenv_values_stream[env0-a=$b-False-expected0] tests/test_main.py::test_dotenv_values_stream[env1-a=$b-True-expected1] tests/test_main.py::test_dotenv_values_stream[env2-a=${b}-False-expected2] tests/test_main.py::test_dotenv_values_stream[env3-a=${b}-True-expected3] tests/test_main.py::test_dotenv_values_stream[env4-b=c\na=${b}-True-expected4] tests/test_main.py::test_dotenv_values_stream[env5-a=${b}-True-expected5] tests/test_main.py::test_dotenv_values_stream[env6-a="${b}"-True-expected6] tests/test_main.py::test_dotenv_values_stream[env7-a='${b}'-True-expected7] tests/test_main.py::test_dotenv_values_stream[env8-a=${a}-True-expected8] tests/test_main.py::test_dotenv_values_stream[env9-a=${a}-True-expected9] tests/test_parser.py::test_parse_stream[-expected0] tests/test_parser.py::test_parse_stream[a=b-expected1] tests/test_parser.py::test_parse_stream['a'=b-expected2] tests/test_parser.py::test_parse_stream[[=b-expected3] tests/test_parser.py::test_parse_stream[ tests/test_parser.py::test_parse_stream[export tests/test_parser.py::test_parse_stream[# tests/test_parser.py::test_parse_stream[a=b#c-expected8] tests/test_parser.py::test_parse_stream[a=b tests/test_parser.py::test_parse_stream[a='b tests/test_parser.py::test_parse_stream[a="b tests/test_parser.py::test_parse_stream[a="b\nc"-expected15] tests/test_parser.py::test_parse_stream[a='b\nc'-expected16] tests/test_parser.py::test_parse_stream[a="b\nc"-expected17] tests/test_parser.py::test_parse_stream[a="b\\nc"-expected18] tests/test_parser.py::test_parse_stream[a='b\\nc'-expected19] tests/test_parser.py::test_parse_stream[a="b\\"c"-expected20] tests/test_parser.py::test_parse_stream[a='b\\'c'-expected21] tests/test_parser.py::test_parse_stream[a=\xe0-expected22] tests/test_parser.py::test_parse_stream[a="\xe0"-expected23] tests/test_parser.py::test_parse_stream[no_value_var-expected24] tests/test_parser.py::test_parse_stream[a: tests/test_parser.py::test_parse_stream[a=b\nc=d-expected26] tests/test_parser.py::test_parse_stream[a=b\rc=d-expected27] tests/test_parser.py::test_parse_stream[a=b\r\nc=d-expected28] tests/test_parser.py::test_parse_stream[a=\nb=c-expected29] tests/test_parser.py::test_parse_stream[a=b\n\nc=d-expected32] tests/test_parser.py::test_parse_stream[a="\nb=c-expected33] tests/test_parser.py::test_parse_stream[a=b\n# tests/test_parser.py::test_parse_stream[uglyKey[%$="S3cr3t_P4ssw#rD"